@c -*- coding: utf-8; mode: texinfo; documentlanguage: fr -*- @ignore Translation of GIT committish: 47c20999a49c7c77167089761a4dd964884e53fe When revising a translation, copy the HEAD committish of the version that you are working on. For details, see the Contributors' Guide, node Updating translation committishes.. @end ignore @c \version "2.17.11" @c Translators: Valentin Villenave, Nicolas Klutchnikoff, Damien Heurtebise @c Translation checkers: Jean-Charles Malahieude, John Mandereau @c Translation status: post-GDP @node Retouche de partition @chapter Retouche de partition @translationof Tweaking output Ce chapitre indique comment modifier le résultat obtenu. LilyPond offre de nombreuses possibilités de réglages, permettant théoriquement de modifier chaque élément de votre partition. @menu * Retouches élémentaires:: * Le manuel de référence des propriétés internes:: * Apparence des objets:: * Positionnement des objets:: * Collisions d'objets:: * Autres retouches:: @end menu @node Retouches élémentaires @section Retouches élémentaires @translationof Tweaking basics @menu * Introduction aux retouches:: * Objets et interfaces:: * Conventions de nommage des objets et propriétés:: * Méthodes de retouche:: @end menu @node Introduction aux retouches @subsection Introduction aux retouches @translationof Introduction to tweaks LilyPond regroupe sous le terme de @qq{retouches} (@emph{tweaks} en anglais) les différents moyens dont dispose l'utilisateur pour intervenir sur l'interprétation du fichier d'entrée et pour modifier l'apparence du fichier de sortie. Certaines retouches sont très simples à mettre en œuvre ; d'autres sont plus complexes. Mais à elles toutes, elles permettent d'obtenir tout ce qu'on veut en matière de musique imprimée. Dans ce chapitre, nous traitons des concepts de base nécessaires pour comprendre l'art de la retouche. Puis nous présentons de nombreuses commandes déjà prêtes, qu'il suffit de recopier pour obtenir un résultat identique dans vos partitions ; nous en profitons pour expliquer comment ces commandes ont été construites, si bien que vous pouvez apprendre par la même occasion à développer vos propres retouches. Avant de vous lancer dans ce chapitre, il peut être utile de revoir la section @ref{Contextes et graveurs}, dans la mesure où les contextes, graveurs et autres propriétés qui y sont décrits, sont indispensables pour comprendre et construire les retouches. @node Objets et interfaces @subsection Objets et interfaces @translationof Objects and interfaces @cindex objet @cindex grob @cindex spanner @cindex extenseur @cindex interface @cindex propriétés des objets @cindex objet, propriétés @cindex objet de rendu @cindex rendu, objets de Toute retouche implique que l'on modifie les opérations internes et les structures du programme LilyPond. Nous allons donc, pour commencer, présenter certains termes qui servent à décrire ces opérations internes et ces structures. Le terme @qq{Objet} est un terme générique qui fait référence à une multitude de structures internes mises en place par LilyPond durant la compilation d'un fichier d'entrée. Ainsi, quand une commande du type @code{\new Staff} apparaît, un nouvel objet du type @code{Staff} est créé. Cet objet @code{Staff} contient alors toutes les propriétés associées à cette portée, par exemple son nom et son armure, ainsi que le détail des graveurs qui ont été désignés pour fonctionner dans ce contexte de portée. Certains objets peuvent contenir les propriétés de tous les autres contextes, comme les objets @code{Voice}, les objets @code{Score}, les objets @code{Lyrics} ; d'autres se rapportent à tous les éléments de notation, comme les barres de mesure, les liaisons, les nuances, etc. Chaque objet dispose de son propre échantillon de valeurs pour le réglage des propriétés. Certains types d'objet portent des noms spécifiques. Les objets qui se rapportent à des éléments de notation sur le fichier de sortie, comme les notes, les hampes, les liaisons de phrasé ou de prolongation, les doigtés, les clefs, etc. sont appelés @qq{Objets de rendu} ; ils sont aussi connus sous le nom d'@qq{Objets graphiques} (en anglais : @emph{Graphical objects} ou @emph{Grobs} pour faire court). Ce sont bien des objets au sens générique ci-dessus et, en tant que tels, ils reçoivent des propriétés qui leur sont associées, comme leur position, leur taille, leur couleur etc. Certains objets de rendu, comme les liaisons de phrasé, les soufflets de crescendo, les marques d'octaviation et beaucoup d'autres @emph{grobs}, ont pour particularité de ne pas se situer à un seul et unique endroit -- ils ont un point de départ, un point d'arrivée, et éventuellement d'autres propriétés relatives à leur forme. Ces objets avec une forme étendue sont appelés des bandeaux (@emph{Spanners} en anglais). Il reste à expliquer ce que sont les @qq{interfaces}. De nombreux objets, qui peuvent être très différents les uns des autres, ont pour point commun de devoir être compilés simultanément. Par exemple, tous les @emph{grobs} ont une couleur, une taille, une position, etc. et toutes ces propriétés sont compilées simultanément durant l'interprétation du fichier d'entrée par LilyPond. Pour alléger ces opérations internes, ces actions et propriétés communes sont regroupées en un objet appelé @code{grob-interface}. Il existe beaucoup d'autres regroupements de propriétés communes dans le genre de celui-ci, chacun portant un nom qui se termine par @code{interface}. En tout, on en compte plus d'une centaine. Nous verrons plus loin en quoi c'est intéressant et utile pour l'utilisateur. Ainsi s'achève le tour des principaux termes relatifs aux objets que nous serons amenés à utiliser dans ce chapitre. @node Conventions de nommage des objets et propriétés @subsection Conventions de nommage des objets et propriétés @translationof Naming conventions of objects and properties @cindex conventions de nommage des objets @cindex conventions de nommage des propriétés @cindex objets, conventions de nommage @cindex propriétés, conventions de nommage Nous avons eu un aperçu, dans @ref{Contextes et graveurs}, de la façon de nommer les objets. Voici maintenant une liste de référence des types d'objets et de propriétés les plus courants, avec leurs conventions de nommage et quelques exemples de cas concrets. La lettre @var{A} représente n'importe quel caractère alphabétique majuscule, et les lettres @var{aaa} un nombre indéterminé de caractères alphabétiques minuscules. Les autres caractères sont à prendre tels qu'ils se présentent. @multitable @columnfractions .33 .33 .33 @headitem Type d'objet/propriété @tab Convention de nommage @tab Exemples @item Contextes @tab Aaaa ou AaaaAaaaAaaa @tab Staff, GrandStaff @item Objets de rendu @tab Aaaa ou AaaaAaaaAaaa @tab Slur, NoteHead @item Graveurs @tab Aaaa_aaa_engraver @tab Clef_engraver, Note_heads_engraver @item Interfaces @tab aaa-aaa-interface @tab grob-interface, break-aligned-interface @item Propriétés de contexte @tab aaa ou aaaAaaaAaaa @tab alignAboveContext, skipBars @item Propriétés d'objet de rendu @tab aaa ou aaa-aaa-aaa @tab direction, beam-thickness @end multitable Comme nous le verrons bientôt, les propriétés des différents types d'objet sont modifiées par des commandes différentes, si bien qu'il est bon de savoir reconnaître le type d'un objet ou d'une propriété en fonction de son nom. @node Méthodes de retouche @subsection Méthodes de retouche @translationof Tweaking methods @cindex retouches, méthodologie @cindex méthodes de retouche @menu * La commande \override:: * La commande \revert:: * Le préfixe \once:: * La commande \overrideProperty:: * La commande \tweak:: @end menu @node La commande \override @unnumberedsubsubsec La commande @code{\override} @translationof The \override command @cindex override, commande @cindex override, syntaxe @funindex \override @funindex override Dans @ref{Modification des propriétés d'un contexte} et dans @ref{Ajout et suppression de graveurs}, nous avons déjà rencontré les commandes @code{\set} et @code{\with}, qui servent à changer les propriétés des @strong{contextes} et à supprimer ou ajouter des @strong{graveurs}. Voici maintenant d'autres commandes plus importantes. La commande pour changer les propriétés des @strong{objets de rendu} est @code{\override}. Du fait que cette commande modifie en profondeur les propriétés internes de LilyPond, sa syntaxe n'est pas aussi simple que pour les commandes vues précédemment. Elle a besoin de savoir avec précision quelle est la propriété à modifier, pour quel objet et dans quel contexte, et quelle doit être sa nouvelle valeur. Voyons de quoi il retourne. La syntaxe générale de cette commande est : @example \override @var{Contexte}.@var{ObjetDeRendu}.@var{propriété-rendu} = #@var{valeur} @end example @noindent Elle attribue à la propriété appelée @var{propriété-rendu}, associée à l'objet @var{ObjetDeRendu}, appartenant lui-même au contexte @var{Contexte}, une valeur @var{valeur}. Le contexte @var{Contexte} peut être omis (c'est généralement le cas) quand il n'y a pas d'ambiguïté et qu'il s'agit d'un contexte de très bas niveau, comme @code{Voice}, @code{ChordNames} ou @code{Lyrics}. Dans les exemples qui suivent, le contexte sera très souvent omis. Nous verrons plus tard dans quelles circonstances il doit impérativement être indiqué. Les sections ci-dessous traitent largement des propriétés et de leurs valeurs -- voir @ref{Types de propriétés} -- mais, pour illustrer la mise en forme et l'utilisation de ces commandes, nous nous limiterons à n'employer que quelques propriétés et valeurs simples, facilement compréhensibles. Lilypond reconnaît comme expression primaire les éléments musicaux tels que les notes, durées et annotations (les @emph{markups}). D'autres expressions de base comme les nombres, chaînes de caractères et listes sont gérées en « mode Scheme », mode appelé en faisant précéder une valeur par un @samp{#}. Bien que certaines valeurs puissent disposer d'une représentation tout à fait valide dans le mode musical de LilyPond, les exemples de ce manuel mentionnent un@samp{#} pour plus de clarté. Pour de plus amples informations quant au mode Scheme, consultez @rextend{Syntaxe Scheme dans LilyPond}. La commande @code{\override} est la plus fréquemment utilisée pour faire des retouches, et pratiquement tout le reste de ce chapitre aura pour but de montrer, à travers des exemples, comment l'utiliser. L'exemple ci-dessous change la couleur des têtes de notes : @cindex couleur,exemple d'utilisation de la propriété @cindex NoteHead, exemple de dérogation @lilypond[quote,fragment,ragged-right,verbatim,relative=1] c4 d \override NoteHead.color = #red e4 f | \override NoteHead.color = #green g4 a b c | @end lilypond @node La commande \revert @unnumberedsubsubsec La commande @code{\revert} @translationof The \revert command @cindex revert, commande @funindex \revert @funindex revert Une fois qu'elle a été modifiée, la propriété conserve sa nouvelle valeur jusqu'à ce qu'elle soit à nouveau modifiée ou qu'elle rencontre la commande @code{\revert}. La commande @code{\revert} obéit à la syntaxe ci-dessous et ramène la valeur de la propriété à sa valeur d'origine. Attention : dans le cas où plusieurs @code{\override} ont été employés, il ne s'agit pas de la valeur précédente mais bien de la valeur par défaut. @example \revert @var{Contexte}.@var{ObjetDeRendu}.@var{propriété-de-rendu} @end example Tout comme pour la commande @code{\override}, la mention du @var{Contexte} est souvent facultative. Elle sera omise dans de nombreux exemples ci-dessous. Voici un exemple qui ramène la couleur des deux dernières notes à leur valeur par défaut : @cindex couleur,exemple d'utilisation de la propriété @cindex NoteHead, exemple de dérogation @lilypond[quote,verbatim,relative=1] c4 d \override NoteHead.color = #red e4 f | \override NoteHead.color = #green g4 a \revert NoteHead.color b4 c | @end lilypond @node Le préfixe \once @unnumberedsubsubsec Le préfixe @code{\once} @translationof The \once prefix @funindex \once @funindex once Les commandes @code{\override} et @code{\set} peuvent supporter toutes les deux le préfixe @code{\once}. Celui-ci a pour fonction de n'appliquer la commande @code{\override} ou @code{\set} qu'à l'instant musical en cours, avant que la propriété ne reprenne sa valeur antérieure -- qui n'est pas forcément la valeur par défaut lorsqu'un autre @code{\override} est toujours effectif. Toujours à partir du même exemple, il est possible de ne changer la couleur que d'une seule note : @cindex couleur,exemple d'utilisation de la propriété @cindex NoteHead, exemple de dérogation @lilypond[quote,fragment,ragged-right,verbatim,relative=1] c4 d \override NoteHead.color = #red e4 f | \once \override NoteHead.color = #green g4 a \revert NoteHead.color b c | @end lilypond Le préfixe @code{\once} peut s'utiliser avec de nombreuses commandes prédéfinies pour en limiter les effets à un seul instant musical : @lilypond[quote,verbatim,relative=1] c4 d \once \stemDown e4 f | g4 a \once \hideNotes b c | @end lilypond Les commandes prédéfinies de la forme @code{\...Neutral}, @code{\...Off} et @code{\un...} font appel, en interne, à une instruction @code{\revert} plutôt que @code{\override} ; les préfixer d'un @code{\once} est donc sans effet. @node La commande \overrideProperty @unnumberedsubsubsec La commande @code{\overrideProperty} @translationof The \overrideProperty command @cindex overrideProperty, commande @funindex \overrideProperty @funindex overrideProperty Il existe une autre forme de commande @code{\override}, @code{\overrideProperty}, qui est parfois utile. Nous la mentionnons ici par souci d'exhaustivité ; pour le détail, voir @rextend{Retouches complexes}. @c Maybe explain in a later iteration -td @node La commande \tweak @unnumberedsubsubsec La commande @code{\tweak} @translationof The \tweak command @cindex tweak, commande @funindex \tweak @funindex tweak La dernière commande disponible pour les retouches est @code{\tweak}. Elle sert à changer les propriétés d'objets qui surviennent simultanément dans la musique, comme par exemple les notes d'un accord. La commande @code{\override} modifierait toutes les notes de l'accord, tandis que @code{\tweak} permet de ne modifier que l'élément immédiatement suivant dans la chaîne de saisie. Voici un exemple. Supposons que nous voulions changer la taille de la tête de note du milieu (le mi) dans un accord de do majeur. Voyons d'abord ce que donnerait @code{\once \override} : @cindex font-size, exemple d'utilisation de la propriété @cindex NoteHead, exemple de dérogation @lilypond[quote,fragment,ragged-right,verbatim,relative=1] 4 \once \override NoteHead.font-size = #-3 4 4 @end lilypond Nous voyons que @code{\override} modifie @strong{toutes} les têtes de notes de l'accord, car toutes les notes de l'accord surviennent au même @strong{instant musical} et que la fonction de @code{\once} est de faire porter la modification sur tous les objets du type spécifié qui surviennent au même instant musical, comme le fait la commande @code{\override} elle-même. La commande @code{\tweak} opère différemment. Elle agit sur l'élément immédiatement suivant dans la chaîne de saisie. Dans sa forme la plus simple, elle ne fonctionne que sur les objets créés directement à partir de l'élément suivant dans la chaîne de saisie, c'est-à-dire essentiellement des têtes de notes et des articulations. Pour reprendre notre exemple, la taille de la note du milieu d'un accord peut être modifiée de cette manière : @cindex font-size, exemple d'utilisation de la propriété @cindex @code{\tweak}, exemple @lilypond[quote,fragment,ragged-right,verbatim,relative=1] 4 4 @end lilypond Vous noterez que la syntaxe de @code{\tweak} est différente de celle de la commande @code{\override}. Ni le contexte, ni l'objet n'ont besoin d'être spécifiés ; au contraire, cela produirait une erreur si on le faisait. Tous deux sont sous-entendus par l'élément suivant dans la chaîne de saisie. Il n'est pareillement pas nécessaire d'insérer un signe égal. La syntaxe générale de la commande @code{\tweak} est donc, tout simplement : @example \tweak @var{propriété-de-rendu} #@var{valeur} @end example La commande @code{\tweak} est aussi utilisée quand on veut, dans une série d'articulations, n'en modifier qu'une seule. Ainsi : @cindex couleur, exemple d'utilisation de la propriété @cindex @code{\tweak}, exemple @lilypond[quote,fragment,ragged-right,verbatim,relative=2] a4^"Black" -\tweak color #red ^"Red" -\tweak color #green _"Green" @end lilypond @noindent Attention : la commande @code{\tweak} doit être précédée d'une marque d'articulation, comme si elle-même était une articulation. Dans la cas de multiples positionnements forcés (@code{^} ou @code{_}), celui le plus à gauche aura préséance puisqu'il sera appliqué en dernier. @cindex @code{\tweak} et altération @cindex @code{\tweak} et objet de rendu spécifique Les objets tels que hampes et altérations seront créés postérieurement à l'événement qui survient. L'utilisation de la commande @code{\tweak} sur de tels objets indirectement créés peut se faire en nommant explicitement l'objet de rendu, si tant est que LilyPond puisse remonter jusqu'à l'événement originel : @lilypond[quote,fragment,ragged-right,verbatim,relative=2] <\tweak Accidental.color #red cis4 \tweak Accidental.color #green es g> @end lilypond Cette forme développée de la commande @code{\tweak} correspond à : @example \tweak @var{objet-de-rendu}.@var{propriété-de-rendu} @var{valeur} @end example @cindex nolets imbriqués @cindex triolets imbriqués @cindex crochet de nolet @cindex nolet, crochet @cindex triolet, crochet @funindex TupletBracket Quand plusieurs nolets sont imbriqués et commencent au même instant musical, c'est encore la commande @code{\tweak} qui est utilisée pour changer l'apparence de l'un d'entre eux. Dans l'exemple suivant, le long crochet de nolet et le premier des trois crochets courts commencent au même instant musical ; une commande @code{\override} s'appliquerait donc à la fois aux deux. En revanche, @code{\tweak} permet de les dissocier. La première commande @code{\tweak} indique que le long crochet doit être placé au-dessus des notes, et la seconde indique que le coefficient de nolet doit être imprimé en rouge sur le premier crochet de triolet court. @cindex @code{\tweak}, exemple @cindex direction, exemple d'utilisation de la propriété @cindex couleur, exemple d'utilisation de la propriété @lilypond[quote,ragged-right,verbatim,fragment,relative=2] \tweak direction #up \tuplet 3/4 { \tweak color #red \tuplet 3/2 { c8[ c c] } \tuplet 3/2 { c8[ c c] } \tuplet 3/2 { c8[ c c] } } @end lilypond Si les nolets imbriqués ne commencent pas au même moment, leur apparence peut alors être modifiée de la façon habituelle, avec la commande @code{\override} : @cindex texte, exemple d'utilisation de la propriété @cindex tuplet-number, exemple de fonction @cindex transparence, exemple d'utilisation de la propriété @cindex TupletNumber, exemple de dérogation @lilypond[quote,ragged-right,verbatim,fragment,relative=1] \tuplet 3/2 { c8[ c c] } \once \override TupletNumber.text = #tuplet-number::calc-fraction-text \tuplet 3/2 { c8[ c] c8[ c] \once \override TupletNumber.transparent = ##t \tuplet 3/2 { c8[ c c] } \tuplet 3/2 { c8[ c c] } } @end lilypond @seealso Manuel de notation : @ruser{La commande d'affinage (@emph{tweak})}. @node Le manuel de référence des propriétés internes @section Le manuel de référence des propriétés internes @translationof The Internals Reference manual @cindex Références internes @menu * Propriétés des objets de rendu:: * Propriétés listées par interface:: * Types de propriétés:: @end menu @node Propriétés des objets de rendu @subsection Propriétés des objets de rendu @translationof Properties of layout objects @cindex propriétés des objets de rendu @cindex propriétés des objets graphiques (grobs) @cindex grobs, propriétés @cindex objets de rendu, propriétés @cindex Manuel des références internes Imaginons que votre partition contienne une liaison trop fine à votre goût et que vous vouliez la rendre plus épaisse. Comment vous y prendre ? Vous êtes convaincu, avec tout ce qui a été dit sur la souplesse de LilyPond, qu'une telle retouche est réalisable et vous vous dites qu'elle fera sans doute intervenir la commande @code{\override}. Mais existe-t-il une propriété épaisseur qui s'applique à une liaison et, dans l'affirmative, comment faire pour la modifier ? C'est là qu'intervient la Référence des propriétés internes. Elle contient toutes les informations dont vous avez besoin pour construire n'importe quelle commande @code{\override}. Avant de nous plonger dans la Référence des propriétés internes, un mot d'avertissement. Il s'agit d'un document de @strong{références}, de sorte qu'il ne contient pas ou peu d'explications : son but est de présenter les informations de façon précise et concise. Cela peut paraître décourageant à première vue. Pas d'inquiétude ! Les conseils et les explications fournis ici vous permettent de retrouver par vous-même les informations dans la Référence des propriétés internes. Il suffit d'un peu de pratique. @cindex override, exemple @cindex dérogation, exemple @cindex Références internes, exemple d'utilisation @cindex @code{\addlyrics} -- exemple Prenons un exemple concret tiré d'un morceau de musique connu : @c Mozart, Die Zauberflöte Nr.7 Duett @lilypond[quote,verbatim,relative=2] { \key es \major \time 6/8 { r4 bes8 bes[( g]) g | g8[( es]) es d[( f]) as | as8 g } \addlyrics { The man who | feels love's sweet e -- | mo -- tion } } @end lilypond Admettons que nous voulions rendre les traits de liaison plus épais. Est-ce possible ? Une liaison est assurément un objet de rendu, si bien que la question est @qq{Existe-t-il une propriété attachée aux liaisons et qui en contrôle l'épaisseur ?} Pour y répondre, nous consultons la Référence des propriétés internes (ou RPI pour faire court). Vous trouverez sur le site de LilyPond @uref{http://lilypond.org} la RPI correspondant à votre version du programme. Allez sur la page Documentation et cliquez sur Référence des propriétés internes. Pour l'apprentissage, mieux vaut utiliser la version HTML standard, et non la @qq{page unique en anglais} ou le PDF. Durant la lecture des prochains paragraphes, il vous est conseillé de vous y reporter réellement afin que les explications prennent tout leur sens. En dessous du bandeau d'en-tête figurent cinq liens. Cliquez sur le lien vers le @emph{Backend}, où se trouvent les informations sur les objets de rendu. En dessous du titre @strong{Backend}, choisissez alors le lien vers @emph{Tous les objets de rendu}. La page qui s'ouvre énumère, dans l'ordre alphabétique, tous les objets utilisés dans votre version de LilyPond. Cliquez sur Liaisons (@emph{Slurs} en anglais), et les propriétés des liaisons apparaîtront. Il existe un autre moyen de trouver cette page, à partir du Manuel de notation. Une des pages qui traitent des liaisons contient un lien vers la Référence des propriétés internes, qui mène directement à cette page. Mais lorsque vous connaissez le nom de l'objet à retoucher, le plus simple est de consulter la RPI. La page de la RPI sur les liaisons commence par préciser que les objets « Liaison » sont créés par le graveur Slur_engraver. Vient ensuite la liste des réglages standard ; vous y trouverez la propriété susceptible de contrôler l'épaisseur des traits de liaison. @example @code{thickness} (nombre) @code{1.2} Épaisseur de ligne, généralement mesurée en @code{line-thickness} @end example Voilà qui semble approprié pour changer l'épaisseur (@emph{thickness} en anglais). On apprend que la valeur de @code{thickness} est un simple nombre (@emph{number}), qu'elle est par défaut définie à 1,2 et que l'unité de mesure est fixée par une autre propriété appelée @code{line-thickness}. Comme il a été indiqué, on ne trouve que peu, voire pas du tout d'explication dans la RPI, mais nous en savons assez pour essayer de changer l'épaisseur de la liaison. Comme nous l'avons vu, le nom de l'objet est @code{Slur}, le nom de la propriété à changer est @code{thickness} et la nouvelle valeur sera un nombre supérieur à @code{1.2} si l'on veut augmenter l'épaisseur du trait. Pour construire la commande @code{\override}, il suffit donc de remplacer les valeurs que nous avons trouvées en guise de noms, en laissant de côté le contexte. Commençons par une valeur très élevée dans un premier temps, pour nous assurer que la commande fonctionne. Nous obtenons : @example \override Slur.thickness = #5.0 @end example N'oublions pas le @code{#} qui doit précéder la nouvelle valeur. La dernière question est : @qq{Où placer cette commande ?} Tant qu'on n'est pas sûr de soi, la meilleure réponse est @qq{À l'intérieur de l'expression musicale, avant la première liaison et proche d'elle.} Essayons : @cindex Slur, exemple de dérogation @cindex thickness, exemple d'utilisation de la propriété @lilypond[quote,verbatim,relative=2] { \key es \major \time 6/8 { % Increase thickness of all following slurs from 1.2 to 5.0 \override Slur.thickness = #5.0 r4 bes8 bes[( g]) g | g8[( es]) es d[( f]) as | as8 g } \addlyrics { The man who | feels love's sweet e -- | mo -- tion } } @end lilypond @noindent et nous constatons que le trait de liaison est beaucoup plus épais. Telle est la façon normale de construire des commandes @code{\override}. Comme nous aurons l'occasion de le voir par la suite, le problème est parfois plus complexe. Dans l'immédiat, nous en savons assez pour construire nos propres commandes -- mais il faut encore s'exercer. Les exemples suivants sont là dans cette intention. @subsubsubheading Détermination du contexte adéquat @c VO Finding the context @cindex contexte, détermination du @cindex contexte, identification correcte du Tout d'abord, de quoi avions-nous besoin pour préciser le contexte ? À quoi devait-il ressembler ? Gageons que les liaisons appartiennent au contexte Voix, dans la mesure où elles sont étroitement liées à une ligne mélodique, mais comment en être sûr ? Pour répondre à cette question, revenons en haut de la page de la RPI consacrée aux liaisons ; il est écrit : @qq{Les objets Liaison sont créés par le graveur Slur_engraver}. Ainsi les liaisons seront créées dans n'importe quel contexte où se trouve le @code{Slur_engraver}. Suivons le lien vers la page @code{Slur_engraver}. Tout en bas, on lit que le @code{Slur_engraver} est un élément appartenant à sept contextes Voix, dont le contexte de voix standard, @code{Voice}. Notre hypothèse était donc juste. Et parce que @code{Voice} est un contexte de très bas niveau, qu'il est activé sans ambiguïté par le fait que l'on est en train de saisir des notes, on peut ici ne pas le mentionner. @subsubsubheading Redéfinition pour une seule occurrence @c VO Overriding once only @cindex dérogation pour une seule fois @cindex usage unique, dérogation à @funindex \once @funindex once Dans le dernier exemple ci-dessus, @emph{toutes} les liaisons étaient plus épaisses. Et si on veut épaissir uniquement la première liaison ? On recourt alors à la commande @code{\once}. Placée juste avant la commande @code{\override}, elle lui indique de ne changer que la liaison commençant avec la note @strong{juste après}. Si la note juste après n'ouvre pas une liaison, la commande sera sans aucun effet -- elle ne reste pas en mémoire jusqu'à la prochaine liaison, elle est purement et simplement ignorée. Il faut donc que la commande introduite par @code{\once} soit insérée comme suit : @cindex Slur, exemple de dérogation @cindex thickness, exemple d'utilisation de la propriété @cindex Liaison, exemple de dérogation @cindex Épaisseur, exemple d'utilisation de la propriété @lilypond[quote,verbatim,relative=2] { \key es \major \time 6/8 { r4 bes8 % Increase thickness of immediately following slur only \once \override Slur.thickness = #5.0 bes8[( g]) g | g8[( es]) es d[( f]) as | as8 g } \addlyrics { The man who | feels love's sweet e -- | mo -- tion } } @end lilypond @noindent Alors seule la première liaison est rendue plus épaisse. La commande @code{\once} peut aussi être utilisée devant la commande @code{\set}. @subsubsubheading Rétablissement @c VO Reverting @cindex revert @cindex rétablissement @cindex retour @cindex défaut, retour aux propriétés par @funindex \revert @funindex revert Et si l'on voulait que les deux premières liaisons soient plus épaisses ? On pourrait bien sûr utiliser deux commandes, chacune précédée de @code{\once} et placée juste avant la note par laquelle débute la liaison : @cindex liaison, exemple de dérogation @cindex thickness, exemple d'utilisation de la propriété @cindex épaisseur, exemple d'utilisation @lilypond[quote,verbatim,relative=2] { \key es \major \time 6/8 { r4 bes8 % Increase thickness of immediately following slur only \once \override Slur.thickness = #5.0 bes[( g]) g | % Increase thickness of immediately following slur only \once \override Slur.thickness = #5.0 g8[( es]) es d[( f]) as | as8 g } \addlyrics { The man who | feels love's sweet e -- | mo -- tion } } @end lilypond @noindent mais on peut aussi, au lieu de la commande @code{\once}, utiliser après la seconde liaison la commande @code{\revert}, qui ramène la propriété @code{thickness} à sa valeur par défaut : @cindex Slur, exemple de dérogation @cindex thickness, exemple d'utilisation de la propriété @cindex liaison, exemple de dérogation @cindex épaisseur, exemple d'utilisation @lilypond[quote,verbatim,relative=2] { \key es \major \time 6/8 { r4 bes8 % Increase thickness of all following slurs from 1.2 to 5.0 \override Slur.thickness = #5.0 bes[( g]) g | g8[( es]) es % Revert thickness of all following slurs to default of 1.2 \revert Slur.thickness d8[( f]) as | as8 g } \addlyrics { The man who | feels love's sweet e -- | mo -- tion } } @end lilypond @noindent N'importe quelle propriété modifiée par @code{\override} peut ainsi être ramenée, grâce à la commande @code{\revert}, à sa valeur par défaut. Ici s'achève notre introduction à la RPI et aux retouches simples. Vous trouverez d'autres exemples dans les prochaines sections de ce chapitre ; ils vous permettront, d'une part, d'apprendre à connaître un peu mieux la RPI et, d'autre part, de vous entraîner un peu plus à y chercher les informations. Ces exemples seront progressivement accompagnés d'explications et introduiront des termes nouveaux. @node Propriétés listées par interface @subsection Propriétés listées par interface @translationof Properties found in interfaces @cindex interface @cindex interfaces, propriétés des @cindex propriétés des interfaces Supposons maintenant que nous voulions imprimer des paroles en italique. Quelle formulation de la commande @code{\override} allons-nous utiliser ? Nous consultons en premier lieu, comme précédemment, la page de la RPI qui contient la liste @qq{Tous les objets de rendu}, et recherchons un objet qui contrôle les paroles. Nous trouvons @code{LyricText}, qui semble approprié. Nous cliquons dessus et nous voyons apparaître les différentes propriétés des paroles, parmi lesquelles @code{font-series} et @code{font-size}. Mais aucune ne propose l'italique. Car la mise en forme des caractères est une propriété commune à tous les objets d'écriture, si bien que, au lieu de figurer dans tous les objets de rendu, elle est regroupée avec d'autres propriétés semblables et placée dans une @strong{Interface}, la @code{font-interface}. Il nous faut donc apprendre à trouver les propriétés des interfaces et découvrir les objets qui utilisent les propriétés de ces interfaces. Retournons à la page de la RPI qui traite des paroles (@emph{LyricText}). En bas de la page est dressée sous forme de liens la liste des interfaces qui concernent LyricText. Cette liste comporte plusieurs entrées, dont @code{font-interface}. En cliquant dessus, nous voyons apparaître les différentes propriétés associées à cette interface, qui sont en même temps les propriétés de tous les objets qui s'y rapportent, parmi lesquels LyricText. Nous avons alors sous les yeux tous les réglages des propriétés qui contrôlent les polices de caractères, et notamment @code{font-shape(symbole)}, où @code{symbole} peut prendre la valeur @code{upright}, @code{italic} ou @code{caps}. Vous remarquerez que @code{font-series} et @code{font-size} figurent aussi dans la liste. La question qui ne manque pas de se poser est : @qq{Comment se fait-il que les propriétés @code{font-series} et @code{font-size} se retrouvent à la fois dans @code{LyricText} et dans l'interface @code{font-interface} alors que ce n'est pas le cas pour @code{font-shape} ?} La réponse est que lorsqu'un objet @code{LyricText} est créé, les valeurs globales par défaut de @code{font-series} et @code{font-size} sont modifiées, mais pas celles de @code{font-shape}. Les possibilités de modification dans @code{LyricText} ne concernent donc que les valeurs à appliquer à @code{LyricText}. Les autres objets qui dépendent de @code{font-interface} fixeront leurs propriétés différemment lorsqu'ils seront créés. Voyons maintenant si nous sommes en mesure de formuler la commande @code{\override} pour mettre les paroles en italique. L'objet est @code{LyricText}, la propriété est @code{font-shape} et la valeur est @code{italic}. Comme auparavant, nous laissons de côté le contexte. Signalons rapidement -- même si cette remarque est importante -- que certaines valeurs de propriétés se présentent sous forme de symboles, comme @code{italic}, et doivent donc être précédées d'une simple apostrophe, Ces symboles seront alors interprétés comme tels par LilyPond. À ne pas confondre avec les chaînes de caractères libres qui se présentent comme @code{"un texte libre"} ; pour plus de détails sur les symboles et les chaînes de caractères, voir le @rextend{Tutoriel Scheme}. Ainsi, la commande @code{\override} pour mettre les paroles en italique est : @example \override LyricText.font-shape = #'italic @end example @noindent et doit être placée juste devant et tout près des paroles à modifier, comme ceci : @cindex font-shape, exemple d'utilisation de la propriété @cindex italic, exemple @cindex LyricText, exemple de dérogation @cindex @code{\addlyrics}, exemple @lilypond[quote,fragment,ragged-right,verbatim,relative=2] { \key es \major \time 6/8 { r4 bes8 bes[( g]) g | g8[( es]) es d[( f]) as | as8 g } \addlyrics { \override LyricText.font-shape = #'italic The man who | feels love's sweet e -- | mo -- tion } } @end lilypond @noindent et voilà les paroles en italiques. @warning{Dans la saisie des paroles, pensez à toujours laisser une espace entre la dernière syllabe et l'accolade fermante.} @seealso Manuel d'extension : @rextend{Tutoriel Scheme}. @node Types de propriétés @subsection Types de propriétés @translationof Types of properties @cindex propriété, types de Nous avons vu jusqu'à maintenant deux types de propriétés : @code{nombre} et @code{symbole}. Pour pouvoir fonctionner, la valeur associée à une propriété doit correspondre au type attendu et suivre les règles liées à ce type. Le type de propriété est toujours donné entre parenthèses après le nom de propriété dans la RPI. Voici une liste des différents types de propriétés, avec les règles qui les régissent et quelques exemples d'utilisation. Il faut, bien sûr, toujours ajouter un symbole @emph{hash} (@code{#}) devant ces valeurs lors de la saisie de la commande @code{\override}, ce même si cette valeur comporte déjà un @code{#} en premier caractère. Les exemples ici présentés ne sont que de simples illustrations ; l'utilisation de Scheme pour obtenir des valeurs fait l'objet de la rubrique @rextend{Scheme et les calculs}. @multitable @columnfractions .2 .45 .35 @headitem Type de propriété @tab Règles @tab Exemples @item Booléenne (@emph{Boolean} en anglais) @tab Vrai (@emph{true} en anglais) ou Faux (@emph{false} en anglais), sous la forme @code{#t} ou @code{#f} @tab @code{#t}, @code{#f} @item Dimension (en espaces de portée) @tab Un nombre décimal (en unités de lignes de portée) @tab @code{2.5}, @code{0.34} @item Direction @tab Une direction valide ou son équivalent numérique (@code{0} ou @code{CENTER} indiquent une position neutre) @tab @code{LEFT}, @code{CENTER}, @code{UP}, @code{1}, @w{@code{-1}} @item Entier (@emph{Integer} en anglais) @tab Un nombre entier @tab @code{3}, @code{-1} @item Liste @tab Une séquence de constantes ou symboles séparés par une espace, encadrées par des parenthèses et précédées par une apostrophe @tab @code{'(left-edge staff-bar)}, @code{'(1)}, @code{'()}, @code{'(1.0 0.25 0.5)} @item Markup (ou étiquette) @tab Toute commande @code{\markup} valide @tab @code{\markup @{ \italic "cresc." @}}, @code{"bagpipe"} @item Durée (@emph{Moment} en anglais) @tab Une durée de note construite avec la fonction make-moment @tab @code{(ly:make-moment 1/4)}, @code{(ly:make-moment 3/8)} @item Nombre @tab Une valeur positive ou négative, qui peut être décimale @tab @code{3}, @w{@code{-2.45}} @item Paire (de nombres) @tab Deux nombres séparées par @qq{espace point espace}, encadrés par des parenthèses et précédés par une apostrophe @tab @code{'(2 . 3.5)}, @code{'(0.1 . -3.2)} @item Symbole @tab L'un des symboles autorisés pour cette propriété, précédé par une apostrophe @tab @code{'italic}, @code{'inside} @item Inconnu (@emph{Unknown} en anglais) @tab Un processus, ou @code{#f} pour empêcher toute action @tab @code{bend::print}, @code{ly:text-interface::print}, @code{#f} @item Vecteur @tab Des constantes encadrés par @code{#(}@dots{}@code{)} @tab @code{'#(#t #t #f)} @end multitable @seealso Manuel d'extension : @rextend{Tutoriel Scheme}. @node Apparence des objets @section Apparence des objets @translationof Appearance of objects Il est temps de mettre en pratique les notions apprises précédemment pour modifier l'allure de la partition ; les exemples qui suivent montrent l'utilisation des différentes méthodes de retouche. @menu * Visibilité et couleur des objets:: * Taille des objets:: * Longueur et épaisseur des objets:: @end menu @node Visibilité et couleur des objets @subsection Visibilité et couleur des objets @translationof Visibility and color of objects Dans un but pédagogique, on peut être amené à masquer certains éléments d'une partition, que les élèves doivent ensuite compléter. Imaginons, par exemple, un exercice dans lequel il faudrait rétablir les barres de mesure dans un morceau de musique. En temps normal, les barres de mesure s'insèrent automatiquement. Comment faire pour les effacer de la partition ? Avant de nous y attaquer, souvenons-nous que les propriétés d'objets sont parfois groupées dans ce qu'on appelle des @emph{interfaces} -- voir @ref{Propriétés listées par interface}. Cela permet de rapprocher toutes les propriétés susceptibles d'être utilisées ensemble pour modifier un objet graphique -- si l'une d'elles est choisie pour un objet, elle s'appliquera à tous les autres. Certains objets tirent alors leurs propriétés de telle ou telle interface, d'autres objets de telle ou telle autre interface. La liste des interfaces qui contiennent les propriétés liées à un objet graphique (@emph{grob}) figure dans la RPI, en bas de la page de description du @emph{grob} ; pour voir ces propriétés, il faut aller voir ces interfaces. Nous avons vu, dans @ref{Propriétés des objets de rendu}, comment trouver les informations sur les @emph{grobs}. Nous procédons de la même manière et consultons la RPI pour connaître l'objet chargé d'imprimer les barres de mesure. En cliquant sur @emph{Backend} puis sur @emph{Tous les objets de rendu}, nous trouvons un objet appelé @code{BarLine}. Parmi ses propriétés, deux d'entre elles déterminent son aspect visuel : @code{break-visibility} et @code{stencil}. L'objet @code{BarLine} est également lié à plusieurs interfaces, dont la @code{grob-interface} où figurent les propriétés @code{transparent} et @code{color}. Toutes peuvent modifier l'aspect visuel des barres de mesure -- et de beaucoup d'autres objets, bien sûr. Examinons chacune d'elles tour à tour. @menu * La propriété stencil:: * La propriété break-visibility:: * La propriété transparent:: * La propriété color:: @end menu @node La propriété stencil @unnumberedsubsubsec La propriété @code{stencil} @translationof The stencil property @cindex stencil, propriété Cette propriété contrôle l'apparence des barres de mesure en précisant le type de symbole (glyphe) à imprimer. Comme pour de nombreuses autres propriétés, on peut lui indiquer de ne rien imprimer en lui attribuant la valeur @code{#f}. Essayons en laissant de côté, une fois encore, le contexte concerné (@code{Voice} en l'occurrence) : @cindex BarLine, exemple de dérogation @cindex stencil, exemple d'utilisation de la propriété @lilypond[quote,fragment,ragged-right,verbatim,relative=2] { \time 12/16 \override BarLine.stencil = ##f c4 b8 c d16 c d8 | g,8 a16 b8 c d4 e16 | e8 } @end lilypond Les barres de mesure sont encore là ! Pourquoi ? Retournons à la RPI et regardons de nouveau la page qui traite des propriétés de @code{BarLine}. En haut de la page, il est précisé que @qq{Les objets BarLine sont créés par le graveur Bar_engraver}. Allons à la page de @code{Bar_engraver}. Tout en bas se trouve la liste des contextes dans lesquels fonctionne ce graveur. Tous sont du type @code{Staff}, de sorte que, si la commande @code{\override} n'a pas fonctionné comme prévu, c'est parce que @code{Barline} n'appartient pas au contexte par défaut, @code{Voice}. Si le contexte spécifié est erroné, la commande ne fonctionne pas. Cela n'entraîne pas de message d'erreur, et rien n'apparaît dans le fichier @emph{log}. Essayons de corriger en mentionnant le bon contexte : @cindex BarLine, exemple de dérogation @cindex stencil, exemple d'utilisation de la propriété @lilypond[quote,fragment,ragged-right,verbatim,relative=2] { \time 12/16 \override Staff.BarLine.stencil = ##f c4 b8 c d16 c d8 | g,8 a16 b8 c d4 e16 | e8 } @end lilypond Cette fois, les barres de mesure ont disparu. Désactiver la propriété @code{stencil} est une opération tellement fréquente que LilyPond dispose d'un raccourci -- @code{\omit} (pour « oublier ») -- à cet effet : @funindex \omit @lilypond[quote,fragment,ragged-right,verbatim,relative=2] { \time 12/16 \omit Staff.BarLine c4 b8 c d16 c d8 | g,8 a16 b8 c d4 e16 | e8 } @end lilypond Vous remarquerez que l'affectation de la valeur @code{#f} à la propriété @code{stencil} déclenchera une erreur dès lors que l'objet en question se doit d'avoir des dimensions pour les nécessités du traitement. Ce sera le cas, par exemple, si vous effacez le @code{stencil} d'un objet @code{NoteHead}. Il vaut mieux, en pareil cas, utiliser la fonction @code{point-stencil} qui, quant à elle, attribue à l'objet une taille à zéro : @lilypond[quote,verbatim,relative=2] { c4 c \once \override NoteHead.stencil = #point-stencil c4 c } @end lilypond @node La propriété break-visibility @unnumberedsubsubsec La propriété @code{break-visibility} @translationof The break-visibility property @cindex break-visibility, propriété La RPI mentionne, à la page sur @code{BarLine}, que la propriété @code{break-visibility} attend comme argument un vecteur de trois booléens. Ceux-ci indiquent respectivement si les barres de mesure doivent être imprimées ou non à la fin de la ligne, à l'intérieur de la ligne et au début de la ligne. Dans notre cas, nous voulons que toutes les barres soient supprimées, si bien que la valeur dont nous avons besoin est @code{#(#f #f #f)}. Essayons, sans oublier d'ajouter le contexte @code{Staff}. Vous remarquerez que, en plus de cette valeur, nous ajoutons @code{##} devant la parenthèse ouvrante. Un second @code{#} est nécessaire car il fait partie intégrante de la valeur contenant un vecteur, et le premier @code{#} est là, comme toujours avec la commande @code{\override}, pour introduire la valeur elle-même. @cindex BarLine, exemple de dérogation @cindex break-visibility exemple d'utilisation de la propriété @lilypond[quote,fragment,ragged-right,verbatim,relative=2] { \time 12/16 \override Staff.BarLine.break-visibility = #'#(#f #f #f) c4 b8 c d16 c d8 | g,8 a16 b8 c d4 e16 | e8 } @end lilypond Comme on peut le constater, cette solution-là aussi supprime les barres de mesure. @node La propriété transparent @unnumberedsubsubsec La propriété @code{transparent} @translationof The transparent property @cindex transparent, propriété @cindex transparence La RPI mentionne, à la page sur @code{grob-interface}, que la propriété @code{transparent} attend comme argument un booléen. Il faudrait donc mettre @code{#t} pour rendre l'objet transparent. Dans cet exemple, essayons de rendre transparente la métrique (@emph{time signature} en anglais) plutôt que les barres de mesure. Pour cela, il nous faut trouver le nom du @emph{grob} chargé de l'indication de mesure. De retour sur la page @qq{Tous les objets de rendu} de la RPI, nous cherchons les propriétés de l'objet @code{TimeSignature}. Celui-ci est géré par le graveur @code{Time_signature_engraver} qui, comme vous pouvez le constater, appartient au contexte @code{Staff} et peut se rattacher à la @code{grob-interface}. Dans ces conditions, la commande pour rendre la métrique transparente est : @cindex TimeSignature, exemple de dérogation @cindex transparent, exemple d'utilisation de la propriété @lilypond[quote,fragment,ragged-right,verbatim,relative=2] { \time 12/16 \override Staff.TimeSignature.transparent = ##t c4 b8 c d16 c d8 | g,8 a16 b8 c d4 e16 | e8 } @end lilypond @noindent L'utilisation de la propriété @code{transparent} étant relativement fréquent, LilyPond dispose d'un raccourci à cet effet : @code{\hide} (pour « masquer ». @funindex \hide @lilypond[quote,fragment,ragged-right,verbatim,relative=2] { \time 12/16 \hide Staff.TimeSignature c4 b8 c d16 c d8 | g,8 a16 b8 c d4 e16 | e8 } @end lilypond @noindent La métrique a bien disparu dans les deux cas, mais la commande a laissé un blanc en lieu et place du chiffrage. Ce peut être souhaitable dans le cadre d'un exercice, afin que les élèves aient la place pour compléter, mais dans d'autres circonstances, ce peut être gênant. Pour y remédier, attribuons plutôt au stencil des métriques la valeur @code{#f} : @cindex TimeSignature, exemple de dérogation @cindex stencil, exemple d'utilisation de la propriété @lilypond[quote,fragment,ragged-right,verbatim,relative=2] { \time 12/16 \override Staff.TimeSignature.stencil = ##f c4 b8 c d16 c d8 | g,8 a16 b8 c d4 e16 | e8 } @end lilypond @noindent La différence est flagrante : le fait d'attribuer au stencil la valeur @code{#f} ou grâce à @code{\omit} supprime totalement l'objet, tandis que le fait de le rendre @code{transparent} -- ce qui s'obtient aussi par la commande @code{\hide} -- le laisse en place, mais de façon invisible. @node La propriété color @unnumberedsubsubsec La propriété @code{color} @translationof The color property @cindex color, propriété Essayons enfin de rendre les barres de mesure invisibles en les colorant en blanc. La difficulté est de savoir si les barres blanches vont couper ou non les lignes de la portée aux endroits où elles se croisent. Vous verrez dans les exemples ci-dessous que cela peut se produire, sans qu'on le sache à l'avance. Les explications de ce phénomène et les solutions pour y remédier sont exposées dans @ruser{Blanchiment des objets}. Pour le moment, acceptons cet inconvénient et concentrons-nous sur l'apprentissage de la gestion des couleurs. La @code{grob-interface} indique que la valeur de la propriété @code{color} est une liste, sans plus d'explication. En fait, cette liste est une liste de valeurs en unités internes ; pour éviter d'avoir à chercher ce qu'il faut y mettre, il existe différents moyens d'indiquer la couleur. Le premier moyen consiste à utiliser l'une des couleurs @emph{normales} de la première @ruser{Liste des couleurs}. Pour mettre les barres de mesure en blanc, on écrit : @cindex BarLine, exemple de dérogation @cindex color, exemple d'utilisation de la propriété @lilypond[quote,fragment,ragged-right,verbatim,relative=2] { \time 12/16 \override Staff.BarLine.color = #white c4 b8 c d16 c d8 | g,8 a16 b8 c d4 e16 | e8 } @end lilypond @noindent et nous constatons que les barres de mesure sont une fois de plus invisibles. Attention : aucune apostrophe ne précède @code{white} -- il ne s'agit pas d'un symbole mais d'une @strong{variable}. Quand on l'invoque, elle fournit une liste de valeurs internes requises pour changer la couleur en blanc. Les autres couleurs aussi, dans la @qq{liste normale}, sont des variables. Pour en être certain, vous pouvez faire l'essai en choisissant une autre variable de la liste en guise de couleur. @cindex couleur X11 @cindex X11, couleurs @funindex x11-color Le deuxième moyen de changer la couleur consiste à utiliser la deuxième @ruser{Liste des couleurs}, dite noms de couleurs X11. Ceux-ci doivent obligatoirement être précédés d'une fonction, @code{x11-color}, qui convertit les noms symboliques de couleur X11 en une liste de valeurs internes comme ceci : @cindex BarLine, exemple de dérogation @cindex color, exemple d'utilisation de la propriété @lilypond[quote,fragment,ragged-right,verbatim,relative=2] { \time 12/16 \override Staff.BarLine.color = #(x11-color 'white) c4 b8 c d16 c d8 | g,8 a16 b8 c d4 e16 | e8 } @end lilypond @noindent Vous noterez que, dans ce cas, la fonction @code{x11-color} admet un symbole comme argument ; il faut donc placer une apostrophe devant le symbole de telle sorte qu'il ne soit pas interprété comme une variable, et insérer l'appel à la fonction à l'intérieur de parenthèses. @cindex rgb, couleur @cindex couleurs rgb @funindex rgb-color Il existe une autre fonction, chargée elle de convertir les valeurs RVB en couleurs internes -- la fonction @code{rgb-color}. Elle comporte trois arguments, donnant respectivement l'intensité du rouge, du vert et du bleu. Ces arguments prennent des valeurs comprises entre 0 et 1. Ainsi, pour choisir la couleur rouge, la valeur serait @code{(rgb-color 1 0 0)} ; pour le blanc, ce serait @code{(rgb-color 1 1 1)} : @cindex BarLine, exemple de dérogation @cindex color, exemple d'utilisation de la propriété @lilypond[quote,fragment,ragged-right,verbatim,relative=2] { \time 12/16 \override Staff.BarLine.color = #(rgb-color 1 1 1) c4 b8 c d16 c d8 | g,8 a16 b8 c d4 e16 | e8 } @end lilypond Enfin, il existe une échelle de gris parmi les possibilités de couleurs X11. Elle va du noir (@code{'grey0}) au blanc (@code{'grey100}), avec un pas de 1. Essayons de l'utiliser en attribuant à tous les objets de notre exemple différentes nuances de gris : @cindex StaffSymbol, exemple de dérogation @cindex TimeSignature, exemple de dérogation @cindex Clef, exemple de dérogation @cindex NoteHead, exemple de dérogation @cindex Stem, exemple de dérogation @cindex BarLine, exemple de dérogation @cindex color, exemple d'utilisation de la propriété @cindex x11-color, exemple d'utilisation @lilypond[quote,fragment,ragged-right,verbatim,relative=2] { \time 12/16 \override Staff.StaffSymbol.color = #(x11-color 'grey30) \override Staff.TimeSignature.color = #(x11-color 'grey60) \override Staff.Clef.color = #(x11-color 'grey60) \override Voice.NoteHead.color = #(x11-color 'grey85) \override Voice.Stem.color = #(x11-color 'grey85) \override Staff.BarLine.color = #(x11-color 'grey10) c4 b8 c d16 c d8 | g,8 a16 b8 c d4 e16 | e8 } @end lilypond @noindent Vous remarquerez le contexte associé à chacun des objets. Une erreur sur ce point empêcherait la commande de fonctionner. Souvenez-vous que le contexte est celui dans lequel est placé le graveur approprié. Pour chaque graveur, on peut trouver son contexte par défaut en partant de l'objet lui-même, puis en cherchant le graveur qui le produit ; la page du graveur dans la RPI nous indique alors le contexte dans lequel le graveur se trouve normalement. @node Taille des objets @subsection Taille des objets @translationof Size of objects @cindex modification de la taille des objets @cindex taille d'objets @cindex objets, taille @cindex objets, modification de taille Pour commencer, reprenons l'exemple qui se trouvait dans @ref{Expressions musicales imbriquées}, qui montrait comment créer une nouvelle portée temporaire, du type @rglos{ossia}. @cindex alignAboveContext, exemple d'utilisation de la propriété @cindex @code{\with}, exemple @lilypond[quote,fragment,ragged-right,verbatim,relative=2] \new Staff ="main" { \relative g' { r4 g8 g c4 c8 d | e4 r8 << { f8 c c } \new Staff \with { alignAboveContext = #"main" } { f8 f c } >> r4 | } } @end lilypond Normalement, les ossias ne comportent ni clef ni indication de mesure, et elles sont imprimées légèrement plus petit que la portée principale. Nous avons déjà appris à enlever la clef et la métrique -- il suffit de régler le stencil de chacun sur @code{#f}, comme ceci : @cindex alignAboveContext, exemple d'utilisation de la propriété @cindex @code{\with}, exemple @cindex Clef, exemple de dérogation @cindex TimeSignature, exemple de dérogation @funindex \omit @lilypond[quote,fragment,ragged-right,verbatim,relative=2] \new Staff ="main" { \relative g' { r4 g8 g c4 c8 d | e4 r8 << { f8 c c } \new Staff \with { alignAboveContext = #"main" } { \omit Staff.Clef \omit Staff.TimeSignature { f8 f c } } >> r4 | } } @end lilypond @noindent La paire d'accolades ajoutée après la clause @code{\with} est nécessaire pour être sûr que les retouches (@code{\override}) ainsi que la musique qui se trouvent à l'intérieur soient bien appliquées à la portée d'ossia. Mais alors, quelle différence y a-t-il à modifier le contexte de portée au moyen de @code{\with} ou à modifier les stencils de la clef et de la métrique avec @code{\override} ou @code{\omit} comme ici ? La principale différence est que les changements opérés dans une clause @code{\with} sont réalisés au moment où le contexte est créé et restent par la suite les valeurs @strong{par défaut} aussi longtemps que ce contexte existe, tandis que les commandes @code{\set} ou @code{\override} insérées dans la musique sont dynamiques -- elles provoquent des changements synchronisés avec un point particulier de la musique. Si les changements sont annulés ou dés activés par @code{\unset} ou @code{\revert}, les réglages reprennent leurs valeurs par défaut, c'est-à-dire celles qui ont été fixées dans la clause @code{\with}, ou, en l'absence de celle-ci, les valeurs par défaut normales. Certaines propriétés de contexte ne peuvent être modifiées que dans une clause @code{\with}. Il s'agit des propriétés qu'on ne peut évidemment plus changer après que le contexte a été créé. C'est le cas de @code{alignAboveContext} et de son pendant, @code{alignBelowContext} -- une fois que la portée a été créée, son alignement est décidé et cela n'aurait aucun sens de vouloir le modifier par la suite. Dans une clause @code{\with}, on peut aussi régler les valeurs par défaut des propriétés d'un objet. Il suffit d'utiliser la commande @code{\override} normale, sans s'occuper du nom de contexte puisqu'il ne fait pas de doute qu'il s'agit du contexte en cours de modification par la clause @code{\with}. Il se produirait même une erreur si le contexte était précisé. Remplaçons donc l'exemple ci-dessus par celui-ci : @cindex alignAboveContext, exemple d'utilisation de la propriété @cindex @code{\with}, exemple @cindex Clef, exemple de dérogation @cindex TimeSignature, exemple de dérogation @lilypond[quote,fragment,ragged-right,verbatim,relative=2] \new Staff ="main" { \relative g' { r4 g8 g c4 c8 d | e4 r8 << { f8 c c } \new Staff \with { alignAboveContext = #"main" % Don't print clefs in this staff \override Clef.stencil = ##f % Don't print time signatures in this staff \override TimeSignature.stencil = ##f } { f8 f c } >> r4 | } } @end lilypond Nous pourrions tout aussi bien utiliser les raccourcis @code{\hide} et @code{\omit} pour activer la propriété @code{transparent} et désactiver le @code{stencil}, ce qui donnerait : @lilypond[quote,fragment,ragged-right,verbatim,relative=2] \new Staff ="main" { \relative g' { r4 g8 g c4 c8 d | e4 r8 << { f8 c c } \new Staff \with { alignAboveContext = #"main" % Don't print clefs in this staff \omit Clef % Don't print time signatures in this staff \omit TimeSignature } { f8 f c } >> r4 | } } @end lilypond Venons-en finalement au changement de taille des objets. Certains objets sont créés comme des glyphes choisis dans une police de caractères. C'est le cas des têtes de notes, des altérations, des @emph{markup}, des clefs, des métriques, des nuances et des paroles. Pour changer leur taille, on modifie la propriété @code{font-size}, comme nous le verrons rapidement. D'autres objets, comme les liaisons de phrasé ou de prolongation -- en général les objets étendus -- sont dessinés à la demande, si bien qu'aucune @code{font-size} ne leur est associée. Ces objets tirent généralement leur dimension des objets auxquels ils sont rattachés, de sorte qu'on ne doit pas avoir à les redimensionner à la main. D'autres propriétés, comme la hauteur des hampes et des barres de mesure, l'épaisseur des ligatures et d'autres lignes, et l'écartement des lignes de portée, doivent encore être modifiées de façon particulière. Si l'on revient à l'exemple d'ossia, commençons par changer la taille de police. Nous pouvons employer deux méthodes. Soit nous changeons la taille de police de chaque type d'objet avec des commandes comme celle-ci pour les têtes de notes (@code{NoteHead}) : @example \override NoteHead.font-size = #-2 @end example soit nous changeons la taille de toutes les polices à la fois grâce à la propriété @code{fontSize}, en utilisant @code{\set} ou en l'insérant dans une clause @code{\with} (mais alors sans le @code{\set}). @example \set fontSize = #-2 @end example Chacune de ces méthodes réduira la taille de police de deux points par rapport à sa valeur précédente, sachant que chaque point réduit ou augmente la taille d'environ 12 %. Essayons sur l'exemple d'ossia : @cindex alignAboveContext, exemple d'utilisation de la propriété @cindex @code{\with}, exemple @cindex Clef, exemple de dérogation @cindex TimeSignature, exemple de dérogation @cindex fontSize, exemple d'utilisation de la propriété @lilypond[quote,fragment,ragged-right,verbatim,relative=2] \new Staff ="main" { \relative g' { r4 g8 g c4 c8 d | e4 r8 << { f8 c c } \new Staff \with { alignAboveContext = #"main" \omit Clef \omit TimeSignature % Reduce all font sizes by ~24% fontSize = #-2 } { f8 f c } >> r4 | } } @end lilypond Ce n'est pas encore parfait. Les têtes de notes et les crochets sont plus petits mais, proportionnellement, les hampes sont trop longues et les lignes de la portée trop espacées. Il faut donc les réduire dans les mêmes proportions que les polices de caractères. La prochaine sous-section montrera comment faire. @node Longueur et épaisseur des objets @subsection Longueur et épaisseur des objets @translationof Length and thickness of objects @cindex distance @cindex épaisseur @cindex longueur @cindex magstep @cindex taille, modification @cindex hampe, modification de longueur @cindex écartement des lignes, modification Dans LilyPond, les écartements et longueurs sont généralement mesurés en @qq{intervalles de lignes} (@emph{staff-spaces} en anglais), c'est-à-dire l'écartement qui sépare deux lignes adjacentes dans la portée -- plus rarement, il est question de demi-intervalles de lignes. Les propriétés d'épaisseur (@code{thickness}), quant à elles, sont généralement mesurées en unités d'une propriété interne appelée @qq{épaisseur de ligne} (@code{line-thickness}). Par exemple, les lignes de (de)crescendo présentent par défaut une épaisseur d'une unité de @code{line-thickness}, alors que l'épaisseur d'une hampe est de 1,3. Toutefois, certaines propriétés d'épaisseur sont différentes : par exemple, l'épaisseur des ligature -- @code{beam-thickness} -- se mesure en espaces de portée. Dans ces conditions, comment ajuster les longueurs à la taille des polices de caractères ? La solution consiste à utiliser une fonction spéciale appelée @code{magstep} -- pseudo facteur de zoom --, créée précisément dans ce but. Elle comporte un argument, le changement de taille de police (@code{#-2} dans l'exemple précédent), à partir duquel elle applique un facteur de mise à l'échelle qui réduit, ou augmente, les objets en question. Voici comment elle s'utilise : @cindex alignAboveContext, exemple d'utilisation de la propriété @cindex @code{\with}, exemple @cindex Clef, exemple de dérogation @cindex TimeSignature, exemple de dérogation @cindex fontSize , exemple d'utilisation de la propriété @cindex StaffSymbol, exemple de dérogation @cindex magstep, exemple d'utilisation de la fonction @cindex staff-space, exemple d'utilisation de la propriété @cindex stencil, exemple d'utilisation de la propriété @lilypond[quote,fragment,ragged-right,verbatim,relative=2] \new Staff ="main" { \relative g' { r4 g8 g c4 c8 d | e4 r8 << { f8 c c } \new Staff \with { alignAboveContext = #"main" \omit Clef \omit TimeSignature fontSize = #-2 % Reduce stem length and line spacing to match \override StaffSymbol.staff-space = #(magstep -2) } { f8 f c } >> r4 | } } @end lilypond @noindent Puisque la longueur des hampes et plusieurs autres propriétés de longueur sont calculées par rapport à la valeur de la propriété @code{staff-space}, elles sont automatiquement mises à l'échelle. Vous remarquerez que cela n'affecte que la dimension verticale de l'ossia -- la dimension horizontale étant déterminée par les objets de la portée principale de façon à rester synchronisée vis-à-vis d'elle, elle n'est pas affectée par tous ces changements de taille. Bien sûr, si l'échelle de toute la portée principale était modifiée, tout le placement horizontal s'en trouverait affecté. Il en sera question plus bas dans cette section. Voilà qui complète la création d'une ossia. Les taille et longueur de tous les objets peuvent être modifiées de manière analogue. Pour de petits changements d'échelle, comme dans l'exemple ci-dessus, il n'est généralement pas utile d'ajuster l'épaisseur des différentes lignes telles que les barres de mesure, les ligatures, les soufflets de crescendo ou decrescendo, les liaisons, etc. Si l'épaisseur d'un objet en particulier doit être ajustée, le mieux est de modifier sa propriété @code{thickness}. Nous avons vu plus haut, dans @ref{Propriétés des objets de rendu}, un exemple de modification de l'épaisseur des liaisons. L'épaisseur de tous les objets tracés (c'est-à-dire ceux qui ne proviennent pas d'une police de caractère) peut être changée de la même manière. @node Positionnement des objets @section Positionnement des objets @translationof Placement of objects @menu * Comportement automatique:: * Objets inclus dans la portée:: * Objets hors de la portée:: @end menu @node Comportement automatique @subsection Comportement automatique @translationof Automatic behavior @cindex objets de la portée @cindex objets extérieurs à la portée @cindex portée, objets de la @cindex portée, objets extérieurs à la Dans la notation musicale, il y a des objets qui appartiennent à la portée et d'autres qui sont placés à l'extérieur de la portée. On les appelle respectivement les @qq{objets de la portée} (@emph{within-staff objects} en anglais) et les @qq{objets extérieurs à la portée} (@emph{outside-staff objects} en anglais). Les objets de la portée sont ceux qui sont placés sur la portée -- les têtes de notes et les hampes, les altérations, etc. Leur position est généralement déterminée par la musique elle-même -- ils sont placés verticalement sur des lignes spécifiques ou sont liés à d'autres objets placés de cette manière. Normalement, les collisions entre les têtes et queues de notes et les altérations dans des accords proches sont évitées automatiquement. Comme nous le verrons rapidement, il existe des commandes et des possibilités de retouche qui permettent de modifier ce comportement automatique. Parmi les objets extérieurs à la portée, on compte des éléments comme les marques de reprise, les indications de texte ou de nuance. Dans LilyPond, la règle est de placer verticalement ces objets extérieurs à la portée le plus près possible de la portée, tout en évitant la collision avec d'autres objets. LilyPond utilise la propriété @code{outside-staff-priority} pour déterminer l'ordre selon lequel placer ces objets, de la manière suivante : D'abord, LilyPond dresse la liste de tous les objets extérieurs à la portée. Puis ceux-ci sont classés suivant leur @code{outside-staff-priority}. Enfin, ils sont pris un par un, en commençant par les objets avec la @code{outside-staff-priority} la plus basse, et placés de façon à ne pas entrer en collision avec d'autres objets déjà placés. Cela signifie que, si deux @emph{grobs} extérieurs à la portée doivent occuper la même place, c'est celui qui a la @code{outside-staff-priority} la plus basse qui est placé le plus près de la portée. Et si deux objets ont la même @code{outside-staff-priority}, le premier rencontré sera placé au plus près de la portée. Dans l'exemple suivant, tous les @emph{markup} ont la même priorité, dans la mesure où rien n'est indiqué explicitement. Vous remarquerez que @code{Text3} est également positionné près de la portée, juste en-dessous de @code{Text2}. @cindex markup, exemple @lilypond[quote,fragment,ragged-right,verbatim,relative=2] c2^"Text1" c2^"Text2" | c2^"Text3" c2^"Text4" | @end lilypond Les portées aussi sont positionnées, par défaut, le plus près possible les unes des autres, en ménageant tout de même une certaine séparation. Si des notes se rapprochent nettement d'une portée adjacente, elles ne forceront les portées à s'écarter que s'il y a un risque de chevauchement. @lilypond[quote,ragged-right,verbatim] << \new Staff { \relative c' { c4 a, } } \new Staff { \relative c'''' { c4 a, } } >> @end lilypond @node Objets inclus dans la portée @subsection Objets inclus dans la portée @translationof Within-staff objects Nous avons vu que les commandes @code{\voiceXXX} jouent sur la direction des liaisons, des doigtés et sur tout autre élément lié à l'orientation des hampes. Ces commandes sont essentielles dans la musique polyphonique pour distinguer des lignes mélodiques entremêlées. Mais il arrive qu'on ait besoin de modifier ce comportement automatique. On peut le faire pour toutes les parties de la musique ou juste pour une note. La propriété qui contrôle ce comportement est la propriété @code{direction} de chaque objet. Expliquons d'abord ce qu'elle fait, puis nous présenterons un certain nombre de commandes déjà prêtes qui évitent, pour les modifications les plus courantes, d'avoir à encoder les retouches. Certains objets comme les traits des liaisons se recourbent tantôt vers le haut, tantôt vers le bas ; d'autres encore, comme les hampes et les crochets, peuvent se décaler vers la gauche ou vers la droite selon qu'ils pointent vers le haut ou vers le bas. Ce comportement est géré automatiquement dès lors que @code{direction} est activé. @menu * La propriété direction:: * Doigtés:: @end menu @node La propriété direction @unnumberedsubsubsec La propriété @code{direction} @translationof The direction property @cindex down @cindex up @cindex center @cindex neutral L'exemple ci-dessous montre dans la première mesure le comportement par défaut des hampes -- celles des notes les plus hautes pointant vers le bas et celles des notes les plus basses pointant vers le haut ; viennent ensuite quatre notes avec les hampes forcées vers le bas, puis quatre autres avec les hampes forcées vers le haut, et pour finir quatre notes de nouveau avec le comportement par défaut. @cindex Stem, exemple de dérogation @cindex direction, exemple d'utilisation de la propriété @lilypond[quote,fragment,ragged-right,verbatim,relative=2] a4 g c a | \override Stem.direction = #DOWN a4 g c a | \override Stem.direction = #UP a4 g c a | \revert Stem.direction a4 g c a | @end lilypond Nous utilisons ici les directions @code{DOWN} et @code{UP}. Elles correspondent respectivement aux valeurs @code{-1} et @code{+1}, que l'on peut utiliser à la place. La valeur @code{0} peut aussi être utilisée dans certains cas. Elle est interprétée comme un @code{UP} pour les hampes, et comme un @qq{centré} pour d'autres objets. Il existe une direction, @code{CENTER}, qui correspond à la valeur @code{0}. Quoi qu'il en soit, ces retouches manuelles sont rarement utilisées car il existe des équivalents sous forme de commandes prédéfinies. Voici un tableau des plus courantes. Lorsque ce n'est pas évident, leur signification est précisée. @multitable @columnfractions .2 .2 .25 .35 @headitem Bas/Gauche @tab Haut/Droite @tab Annulation @tab Effet @item @code{\arpeggioArrowDown} @tab @code{\arpeggioArrowUp} @tab @code{\arpeggioNormal} @tab Flèche en bas, en haut, ou pas de flèche @item @code{\dotsDown} @tab @code{\dotsUp} @tab @code{\dotsNeutral} @tab Déplacement des points pour éviter les lignes de portée @item @code{\dynamicDown} @tab @code{\dynamicUp} @tab @code{\dynamicNeutral} @tab @item @code{\phrasingSlurDown} @tab @code{\phrasingSlurUp} @tab @code{\phrasingSlurNeutral} @tab Attention : à distinguer des commandes de liaison ci-dessous @item @code{\slurDown} @tab @code{\slurUp} @tab @code{\slurNeutral} @tab @item @code{\stemDown} @tab @code{\stemUp} @tab @code{\stemNeutral} @tab @item @code{\textSpannerDown} @tab @code{\textSpannerUp} @tab @code{\textSpannerNeutral} @tab Le texte saisi en tant qu'extension est au-dessous/au-dessus de la portée @item @code{\tieDown} @tab @code{\tieUp} @tab @code{\tieNeutral} @tab @item @code{\tupletDown} @tab @code{\tupletUp} @tab @code{\tupletNeutral} @tab Les nolets sont au-dessous/au-dessus des notes @end multitable Les variantes @code{\xxxNeutral} et @code{\xxxNormal} de ces commandes sont implémentées à l'aide de @code{\revert} ; elles @strong{ne doivent pas} être précédées de @code{\once}. Pour limiter les effets des autres commandes prédéfinies (fonctionnant à base de @code{\override}) à une seule note, il faut les faire précéder d'un @code{\once}, comme pour toute dérogation. @node Doigtés @unnumberedsubsubsec Doigtés @translationof Fingering @cindex doigtés, positionnement @cindex doigtés, accords Le placement des doigtés sur des notes simples peut aussi être contrôlé par la propriété @code{direction}, mais le changement de @code{direction} n'a pas d'effet sur les accords. Comme nous le verrons, il existe des commandes qui permettent de contrôler le doigté sur chaque note d'un accord, en plaçant l'indication de doigté au-dessus, en dessous, à gauche ou à droite de chaque note. Tout d'abord, voici l'effet de @code{direction} sur le doigté lié à une note simple. La première mesure montre le comportement par défaut, et les deux suivantes montrent l'effet lorsqu'on indique @code{DOWN} et @code{UP} : @cindex doigtés, exemple de dérogation @cindex direction, exemple d'utilisation de la propriété @lilypond[quote,verbatim,relative=2] c4-5 a-3 f-1 c'-5 | \override Fingering.direction = #DOWN c4-5 a-3 f-1 c'-5 | \override Fingering.direction = #UP c4-5 a-3 f-1 c'-5 | @end lilypond Le fait d'intervenir sur la propriété @code{direction} n'est sûrement pas la façon la plus simple de placer manuellement les doigtés au-dessus ou en dessous des notes ; mieux vaut utiliser @code{_} ou @code{^} devant le chiffre de doigté plutôt que @code{-}. Voici ce que donne l'exemple précédent avec cette méthode : @cindex doigtés, exemple @lilypond[quote,verbatim,relative=2] c4-5 a-3 f-1 c'-5 | c4_5 a_3 f_1 c'_5 | c4^5 a^3 f^1 c'^5 | @end lilypond La propriété @code{direction} ne fonctionne pas pour les accords alors que les préfixes de direction, @code{_} et @code{^}, fonctionnent. Par défaut, le doigté est placé automatiquement à la fois au-dessus et au-dessous des notes d'un accord, comme ceci : @cindex doigtés, exemple @lilypond[quote,verbatim,relative=2] 4 4 4 @end lilypond @noindent mais il est possible de forcer manuellement vers le haut ou vers le bas le placement de tous ou certains chiffres de doigté, comme ceci : @cindex doigtés, exemple @lilypond[quote,verbatim,relative=2] 4 4 4 @end lilypond On peut aller encore plus loin dans le positionnement des doigtés pour chacune des notes d'un accord grâce à la commande @code{\set fingeringOrientations}. La syntaxe de cette commande est : @example @code{\set fingeringOrientations = #'([up] [left/right] [down])} @end example @noindent On utilise @code{\set} car @code{fingeringOrientations} est une propriété du contexte @code{Voice}, créée et utilisée par le graveur @code{New_fingering_engraver}. On peut attribuer à cette propriété une liste composée de une à trois valeurs. Celles-ci déterminent si l'indication de doigté doit être placée au-dessus (lorsque @code{up} apparaît dans la liste), au-dessous (lorsque @code{down} apparaît), à gauche (lorsque @code{left} apparaît) ou à droite (lorsque @code{right} apparaît). En revanche, si une valeur n'est pas dans la liste, aucun doigté n'ira à cet emplacement. LilyPond garde ces contraintes en mémoire et recherche le meilleur emplacement pour le doigté des notes des accords suivants. Vous remarquerez que @code{left} et @code{right} s'excluent l'un l'autre -- l'indication de doigté ne peut être placée que d'un côté ou de l'autre, pas des deux. @warning{Pour contrôler à l'aide de cette commande le placement du doigté sur une note simple, il faut la saisir comme un accord composé d'une note unique, en l'encadrant de chevrons.} Voici quelques exemples : @cindex doigtés, exemple @cindex @code{\set}, exemple d'utilisation @cindex fingeringOrientations, exemple d'utilisation de la propriété @lilypond[quote,fragment,ragged-right,verbatim,relative=1] \set fingeringOrientations = #'(left) 4 4 \set fingeringOrientations = #'(left) 4 4 | \set fingeringOrientations = #'(up left down) 4 4 \set fingeringOrientations = #'(up left) 4 4 | \set fingeringOrientations = #'(right) 4 4 @end lilypond @noindent Si les indications de doigtés paraissent un peu serrées, on peut toujours réduire la taille de police (@code{font-size}). La valeur par défaut donnée dans la RPI à la page de l'objet @code{Fingering} étant @code{-5}, essayons @w{@code{-7}} : @lilypond[quote,fragment,ragged-right,verbatim,relative=1] \override Fingering.font-size = #-7 \set fingeringOrientations = #'(left) 4 4 \set fingeringOrientations = #'(left) 4 4 | \set fingeringOrientations = #'(up left down) 4 4 \set fingeringOrientations = #'(up left) 4 4 | \set fingeringOrientations = #'(right) 4 4 @end lilypond @node Objets hors de la portée @subsection Objets hors de la portée @translationof Outside-staff objects Les objets extérieurs à la portée sont placés automatiquement de façon à éviter les collisions. Il est toutefois possible, grâce à différentes méthodes, de rectifier un positionnement automatique qui se révèlerait ne pas être optimal. @menu * La propriété outside-staff-priority:: * La commande \textLengthOn:: * Positionnement des nuances:: * Dimensionnement des objets graphiques:: @end menu @node La propriété outside-staff-priority @unnumberedsubsubsec La propriété @code{outside-staff-priority} @translationof The outside-staff-priority property Les objets avec la plus petite valeur de la propriété @code{outside-staff-priority} sont placés au plus près de la portée, tandis que les autres sont écartés autant qu'il faut pour éviter les collisions. La @code{outside-staff-priority} est définie dans la @code{grob-interface} ; elle est donc une propriété commune à tous les objets de rendu. Par défaut, elle est réglée sur @code{#f} pour tous les objets de la portée, et porte une valeur numérique appropriée à chacun des objets extérieurs à la portée, à mesure qu'ils sont créés. Le tableau suivant montre la valeur numérique par défaut pour quelques-uns des objets extérieurs à la portée les plus courant. @cindex spanners @cindex bandeaux @cindex extenseurs Vous noterez au passage certaines particularités quant au nom des objets. En effet, des objets à extension sont automatiquement créés dans le but de pouvoir contrôler le positionnement vertical des extrémités d'un @emph{grob} qui commencerait et se terminerait à des instants musicaux différents. C'est la raison pour laquelle modifier le @code{outside-staff-priority} du @emph{grob} sous-jacent n'aura aucun effet. C'est par exemple le cas lorsque vous modifiez l'alignement d'un objet @code{Hairpin} à l'aide de @code{outside-staff-priority} ; puisque le soufflet est associé à un objet @code{DynamicLineSpanner}, c'est sur celui-ci que doit porter l'effet de @code{outside-staff-priority}. L'instruction dérogatoire se place au début du bandeau qui constitue une ligne de base susceptible de contenir plusieurs soufflets ou indications de nuance. @multitable @columnfractions .3 .3 .3 @headitem Objet de rendu @tab Priorité @tab Contrôle la position de : @item @code{RehearsalMark} @tab @code{1500} @tab Repère @item @code{MetronomeMark} @tab @code{1000} @tab Indication métronomique @item @code{VoltaBracketSpanner} @tab @code{600} @tab Bandeau de répétition @item @code{TextScript} @tab @code{450} @tab Texte des @emph{markup} (ou étiquettes) @item @code{MultiMeasureRestText} @tab @code{450} @tab Texte sur les silences qui couvrent des mesures entières @item @code{OttavaBracket} @tab @code{400} @tab Indication d'octaviation @item @code{TextSpanner} @tab @code{350} @tab Bandeau ou extension de texte @item @code{DynamicLineSpanner} @tab @code{250} @tab Toutes les marques de nuances @item @code{BarNumber} @tab @code{100} @tab Numéro de mesure @item @code{TrillSpanner} @tab @code{50} @tab Bandeau de trille @end multitable Voici un exemple qui montre le placement par défaut de certains d'entre eux. @cindex extension de texte @cindex indication d'octaviation @funindex \startTextSpan @funindex startTextSpan @funindex \stopTextSpan @funindex stopTextSpan @cindex TextSpanner, exemple de dérogation @cindex bound-details, exemple d'utilisation de la propriété @lilypond[quote,fragment,ragged-right,verbatim,relative=1] % Set details for later Text Spanner \override TextSpanner.bound-details.left.text = \markup { \small \bold Slower } % Place dynamics above staff \dynamicUp % Start Ottava Bracket \ottava #1 c'4 \startTextSpan % Add Dynamic Text and hairpin c4\pp\< c4 % Add Text Script c4^Text | c4 c % Add Dynamic Text and terminate hairpin c4\ff c \stopTextSpan | % Stop Ottava Bracket \ottava #0 c,4 c c c | @end lilypond Cet exemple montre comment créer des extensions de texte (@emph{Text Spanners} en anglais) -- texte avec des longues lignes au-dessus d'un passage musical. L'extension s'étend depuis la commande @code{\startTextSpan} jusqu'à la commande @code{\stopTextSpan} et le format de texte est défini par la commande @code{\override TextSpanner}. Pour de plus amples détails, voir @ruser{Indication textuelle avec extension}. Il montre aussi comment créer des marques d'octaviation. @cindex modification du positionnement des numéros de mesure @cindex numéros de mesure, modification du positionnement @cindex modification du positionnement des indications métronomiques @cindex indications métronomiques, modification du positionnement @cindex modification du positionnement des marques de repère @cindex marques de repère, modification du positionnement Si les valeurs de @code{outside-staff-priority} par défaut ne donnent pas les résultats escomptés, il suffit de modifier la priorité de l'un de ces objets. Supposons que vous vouliez placer l'indication d'octaviation sous le bandeau de texte, dans l'exemple précédent. Tout ce que nous devons faire, c'est regarder la priorité de @code{OttavaBracket} dans la Référence des propriétés internes ou dans le tableau plus haut, et la ramener à une valeur plus basse que celle de @code{TextSpanner}, en gardant à l'esprit que @code{OttavaBracket} est créé dans le contexte @code{Staff} : @cindex TextSpanner, exemple de dérogation @cindex bound-details, exemple d'utilisation de la propriété @lilypond[quote,fragment,ragged-right,verbatim,relative=1] % Set details for later Text Spanner \override TextSpanner.bound-details.left.text = \markup { \small \bold Slower } % Place dynamics above staff \dynamicUp % Place following Ottava Bracket below Text Spanners \once \override Staff.OttavaBracket.outside-staff-priority = #340 % Start Ottava Bracket \ottava #1 c'4 \startTextSpan % Add Dynamic Text c4\pp % Add Dynamic Line Spanner c4\< % Add Text Script c4^Text | c4 c % Add Dynamic Text c4\ff c \stopTextSpan | % Stop Ottava Bracket \ottava #0 c,4 c c c | @end lilypond N'oublions pas que certains objets, tels les numéros de mesure, indications métronomiques et marques-repères, sont par défaut attachés au contexte @code{Score}. @cindex liaisons et outside-staff-priority @cindex liaisons et articulations @cindex articulations et liaisons Les liaisons sont intrinsèquement des objets membres de la portée (@emph{within-staff objects}) bien qu'elles la surplombent lorsque les notes auxquelles elles se rattachent sont relativement hautes. Ceci peut avoir pour conséquence de remonter d'autant les objets externes (@emph{outside-staff objects}) tels les articulations. La propriété @code{avoid-slur} de l'articulation en question peut se voir déterminée à @code{'inside} dans le but de @qq{ramener} cette articulation à l'intérieur de la liaison. Cette propriété @code{avoid-slur} ne sera toutefois effective que dans la mesure où la @code{outside-staff-priority} est désactivée (valeur @code{#f}). Dans le même esprit, il est possible d'affecter une valeur numérique particulière à la propriété @code{outside-staff-priority} d'une liaison dans le but de regrouper la liaison avec les objets externes. L'exemple suivant illustre ces deux différentes méthodes. @lilypond[quote,verbatim,relative=2] c4( c^\markup { \tiny \sharp } d4.) c8 | c4( \once \override TextScript.avoid-slur = #'inside \once \override TextScript.outside-staff-priority = ##f c4^\markup { \tiny \sharp } d4.) c8 | \once \override Slur.outside-staff-priority = #500 c4( c^\markup { \tiny \sharp } d4.) c8 | @end lilypond Le fait de changer la @code{outside-staff-priority} peut aussi servir à contrôler le positionnement vertical des objets individuels, quoique le résultat ne soit pas toujours formidable. Imaginons que nous voulions placer @qq{Text3} au-dessus de @qq{Text4} dans l'exemple de la section @ref{Comportement automatique}, plus haut. Il nous suffit pour cela de regarder dans la Référence des propriétés internes ou dans le tableau plus haut la priorité de @code{TextScript}, et d'augmenter la priorité de @qq{Text3} jusqu'à une valeur très haute : @cindex TextScript, exemple de dérogation @cindex outside-staff-priority, exemple d'utilisation de la propriété @lilypond[quote,fragment,ragged-right,verbatim,relative=2] c2^"Text1" c2^"Text2" | \once \override TextScript.outside-staff-priority = #500 c2^"Text3" c2^"Text4" | @end lilypond S'il est vrai que cela place @qq{Text3} au-dessus de @qq{Text4}, ça le place aussi plus haut que @qq{Text2} tandis que @qq{Text4} dégringole. Ce n'est peut-être pas si bien que ça. En fait, ce que nous aimerions faire, c'est placer toutes les annotations à égale distance de la portée. Pour cela, nous avons besoin d'espacer horizontalement les notes pour laisser plus de place au texte. C'est possible grâce à la commande @code{textLengthOn}. @node La commande \textLengthOn @unnumberedsubsubsec La commande @code{\textLengthOn} @translationof The \textLengthOn command @cindex notes, répartition selon le texte @funindex \textLengthOn @funindex textLengthOn @funindex \textLengthOff @funindex textLengthOff Par défaut, l'espacement horizontal d'un texte produit sous forme de @emph{markup} (ou d'étiquette) n'est pas pris en compte, dans la mesure où ce qui est concerné n'entre pas dans la musique. La commande @code{\textLengthOn} inverse ce comportement, faisant en sorte que les notes soient espacées autant qu'il le faut pour s'adapter au texte : @lilypond[quote,fragment,ragged-right,verbatim,relative=2] \textLengthOn % Cause notes to space out to accommodate text c2^"Text1" c2^"Text2" | c2^"Text3" c2^"Text4" | @end lilypond La commande qui permet de revenir au comportement par défaut est @code{\textLengthOff}. Alternativement, lorsque l'instruction @code{\textLengthOn} se limite à un seul instant musical, vous pouvez la préfixer d'un @code{\once}.@* LilyPond dispose de commandes équivalentes et dévolues au traitement des repères et indications de tempo : @code{\markLengthOn} et @code{\markLengthOff}. @cindex étiquette de texte et collision Les textes des @emph{markup} éviteront également les notes qui s'échappent au-dessus de la portée. Si ce n'est pas notre souhait, il est possible de supprimer ce déplacement automatique vers le haut en attribuant à la priorité la valeur @code{#f}. Voici un exemple qui montre comment les textes des @emph{markup} interagissent avec ces types de note. @cindex TextScript, exemple de dérogation @cindex outside-staff-priority, exemple d'utilisation de la propriété @lilypond[quote,fragment,ragged-right,verbatim,relative=2] % This markup is short enough to fit without collision c2^"Tex" c'' | R1 | % This is too long to fit, so it is displaced upwards c,,2^"Text" c'' | R1 | % Turn off collision avoidance \once \override TextScript.outside-staff-priority = ##f c,,2^"Long Text " c'' | R1 | % Turn off collision avoidance \once \override TextScript.outside-staff-priority = ##f \textLengthOn % and turn on textLengthOn c,,2^"Long Text " % Spaces at end are honored c''2 | @end lilypond @node Positionnement des nuances @unnumberedsubsubsec Positionnement des nuances @translationof Dynamics placement @cindex modification du positionnement des nuances @cindex nuances, modification du positionnement Les indications de nuance se placent normalement sous la portée, mais on peut les placer au-dessus avec la commande @code{\dynamicUp}. Elles se positionnent verticalement par rapport à la note à laquelle elles sont liées et se décalent vers le bas (ou le haut) en fonction des objets de la portée comme les liaisons de phrasé ou les numéros de mesure. Cela peut donner d'assez bons résultats, comme le montre cet exemple : @lilypond[quote,fragment,ragged-right,verbatim,relative=1] \clef "bass" \key aes \major \time 9/8 \dynamicUp bes4.~\f\< \( bes4 bes8 des4\ff\> c16 bes\! | ees,2.~\)\mf ees4 r8 | @end lilypond De toute façon, si les notes et les nuances qui leur sont liées sont trop proches, le positionnement automatique évitera les collisions en déplaçant davantage les nuances suivantes, mais le résultat peut ne pas être très satisfaisant, comme le montre cet exemple artificiel : @lilypond[quote,fragment,ragged-right,verbatim,relative=2] \dynamicUp a4\f b\mf c\mp b\p @end lilypond @noindent Si une telle situation devait survenir dans de la musique @qq{réelle}, il serait préférable d'espacer un peu plus les notes, de façon que les indications de nuance puissent toutes se situer à la même distance de la portée. S'il est possible de faire cela pour les textes de @emph{markup} grâce à la commande @code{\textLengthOn}, il n'existe pas d'équivalent pour les indications de nuance. Il nous faut donc chercher à faire cela avec la commande @code{\override}. @node Dimensionnement des objets graphiques @unnumberedsubsubsec Dimensionnement des objets graphiques @translationof Grob sizing @cindex grob, dimensionnement @cindex dimensionnement des grobs Tout d'abord, nous devons apprendre ce qui détermine la dimension des @emph{grobs}. Tous les @emph{grobs} portent en eux un point de référence qui est utilisé pour les positionner par rapport à leur objet parent. Ce point du @emph{grob} est placé à une distance horizontale, @code{X-offset}, et à une distance verticale, @code{Y-offset}, de son parent. L'étendue horizontale de l'objet est fixée par une paire de nombres, @code{X-extent}, qui donnent la position du coin gauche et du coin droit par rapport au point de référence. De même, l'amplitude verticale est fixée par une paire de nombres, @code{Y-extent}. Ce sont des propriétés communes à tous les @emph{grobs} et que gère la @code{grob-interface}. @cindex @code{extra-spacing-width} Par défaut, la largeur des objets extérieurs à la portée est donnée comme étant nulle, si bien qu'ils peuvent se chevaucher horizontalement. Pour remédier à cela, on a ajouté l'infini à l'extension gauche et moins l'infini à l'extension droite, en attribuant à @code{extra-spacing-width} la valeur @code{'(+inf.0 . -inf.0)}. Pour être sûr que les objets ne se chevaucheront pas horizontalement, nous devons donc corriger cette valeur de @code{extra-spacing-width} en @code{'(0 . 0)}, afin que leur vraie largeur se manifeste. La commande pour y parvenir avec des indications de nuances est : @example \override DynamicText.extra-spacing-width = #'(0 . 0) @end example @noindent Voyons si ça marche sur notre exemple précédent : @cindex DynamicText, exemple de dérogation @cindex extra-spacing-width, exemple d'utilisation de la propriété @lilypond[quote,fragment,ragged-right,verbatim,relative=2] \dynamicUp \override DynamicText.extra-spacing-width = #'(0 . 0) a4\f b\mf c\mp b\p | @end lilypond @noindent Bon, cela a mis un terme aux déplacements verticaux des nuances mais il reste deux problèmes. Il faudrait que les nuances soient un peu plus écartées et ce serait mieux si elles étaient toutes à la même distance de la portée. Le premier problème est simple à résoudre. Au lieu d'attribuer à @code{extra-spacing-width} la valeur zéro, nous pourrions mettre un peu plus. L'unité est la distance entre deux lignes de portée, donc en écartant le bord gauche d'une demie unité et le bord droit d'une demie unité, on obtient : @cindex DynamicText, exemple de dérogation @cindex extra-spacing-width, exemple d'utilisation de la propriété @lilypond[quote,fragment,ragged-right,verbatim,relative=2] \dynamicUp % Extend width by 1 staff space \override DynamicText.extra-spacing-width = #'(-0.5 . 0.5) a4\f b\mf c\mp b\p @end lilypond @noindent C'est mieux mais nous voulons peut-être aligner les indications de nuance sur une même ligne plutôt que de les voir monter et descendre avec les notes. La propriété qui gère cela est @code{staff-padding} ; la section suivante lui est consacrée. @node Collisions d'objets @section Collisions d'objets @translationof Collisions of objects @menu * Déplacement d'objets:: * Correction des collisions d'objets:: * Exemple concret:: @end menu @node Déplacement d'objets @subsection Déplacement d'objets @translationof Moving objects @cindex déplacement d'objets se chevauchant @cindex déplacement d'objets en collision @cindex déplacement de grobs en collision @cindex objets, évitement des collisions @cindex grobs, évitement des collisions Aussi surprenant que cela puisse paraître, LilyPond n'est pas parfait. Certains éléments sur la partition peuvent se chevaucher, ce qui est regrettable mais, le plus souvent, facile à corriger. En général, quand on déplace des objets, c'est pour des raisons de lisibilité ou d'esthétique -- ils rendraient mieux avec un peu plus ou un peu moins d'espace autour d'eux. Il y a trois façons de résoudre les problèmes de chevauchement. Il est préférable de les aborder dans l'ordre suivant : @enumerate @item L'@strong{orientation} d'un objet qui en chevauche un autre peut être changée grâce aux commandes prédéfinies dont la liste a été donnée plus haut à propos des objets de portée (voir @ref{Objets inclus dans la portée}). Les queues de note, les liaisons de phrasé et de prolongation, les crochets, les nuances et les nolets peuvent facilement être repositionnés de cette manière. En contrepartie, vous n'avez le choix qu'entre deux positions, sans personnalisation possible. @item Les @strong{propriétés d'objet}, auxquelles LilyPond a recours pour positionner les objets, sont modifiables avec @code{\override}. Il y a deux avantages à changer ces propriétés : (a) d'autres objets pourront être déplacés automatiquement si nécessaire pour faire de la place, et (b) la même retouche peut s'appliquer à toutes les occurrences du même type d'objet. Ces propriétés sont : @itemize @item @code{direction} Ce point a déjà été traité en détails -- voir @ref{Objets inclus dans la portée}. @item @code{padding}, @code{right-padding}, @code{staff-padding} @cindex décalage (padding) @cindex padding, propriété @cindex right-padding, propriété @cindex staff-padding, propriété Au moment de positionner un objet, la valeur de sa propriété @code{padding} détermine l'espace à laisser libre entre celui-ci et le coin le plus proche de l'objet à côté duquel il est placé. Vous remarquerez que c'est la valeur @code{padding} de l'objet @strong{à placer} qui compte ; la valeur @code{padding} de l'objet déjà placé est ignorée. Les espaces libres déterminés par @code{padding} s'appliquent à tous les objets associés à la @code{side-position-interface}. Le positionnement de groupes d'altérations est contrôlé par @code{right-padding}, et non plus @code{padding}. Cette propriété appartient à l'objet @code{AccidentalPlacement} qui, vous le remarquerez, prend place dans le contexte @strong{Staff}. Dans le processus de composition, les têtes de notes sont disposées en premier, puis les altérations, s'il y en a, sont ajoutées à gauche des têtes de note suivant la propriété @code{right-padding} qui détermine l'espacement par rapport aux têtes de note. C'est pourquoi seule la propriété @code{right-padding} de l'objet @code{AccidentalPlacement} joue sur le positionnement des altérations. La propriété @code{staff-padding} est très proche de la propriété @code{padding} : @code{padding} contrôle l'espace minimum entre un objet qui accepte la @code{side-position-interface} et l'objet le plus proche (généralement une note ou une ligne de portée) ; @code{staff-padding} ne s'applique qu'aux objets qui sont toujours placés au-dehors de la portée -- il contrôle l'espace minimum à insérer entre l'objet et la portée. Attention : par défaut, @code{staff-padding} concerne les objets positionnés par rapport à la portée et n'a aucun effet sur les objets qui sont positionnés par rapport à une note ; il est toutefois possible de le régler pour fonctionner avec ces derniers. Pour trouver quelle propriété @code{padding} employer pour l'objet que vous cherchez à repositionner, il vous faut consulter les propriétés de l'objet dans la RPI. Prenez garde que les propriétés @code{padding} ne sont pas forcément traitées dans l'objet en question ; il faut alors regarder les objets qui semblent s'en rapprocher. Toutes les valeurs @code{padding} sont exprimées en espace de portée. Pour la plupart des objets, la valeur par défaut est aux alentours de 1,0 et parfois moins (cela dépend de chaque objet). Il est possible de la modifier lorsqu'on a besoin d'un espace vide plus grand (ou plus petit). @item @code{self-alignment-X} @cindex self-alignment-X, propriété Cette propriété sert à aligner les objets sur la gauche, sur la droite ou à les centrer par rapport au point de référence des objets parents. Elle peut être utilisée avec tous les objets qui acceptent la @code{self-alignment-interface}. Il s'agit, en général, des objets qui contiennent du texte. Les valeurs admises sont @code{LEFT}, @code{RIGHT} et @code{CENTER}. On peut aussi attribuer à la place une valeur numérique entre @code{-1} et @code{+1}, où @code{-1} signifie alignement sur la gauche, @code{+1} alignement sur la droite, et les nombres intermédiaires déplacent progressivement le texte de la gauche vers la droite. Des valeurs numériques supérieures à @code{1} sont également admises pour déplacer le texte encore plus loin vers la gauche, ou des valeurs inférieures à @code{-1} pour déplacer le texte encore plus loin vers la droite. Un écart de @code{1} en valeur correspond à un déplacement de la moitié de la longueur du texte. @item @code{extra-spacing-width} @cindex extra-spacing-width, propriété Cette propriété est utilisée pour tous les objets qui acceptent la @code{item-interface}. Elle reçoit deux nombres, le premier étant ajouté au bord gauche et le second au bord droit. Des nombres négatifs déplacent le coin vers la gauche, des nombres positifs vers la droite, si bien que pour élargir un objet, le premier nombre doit être négatif et le second positif. Attention : tous les objets n'acceptent pas forcément les deux nombres. Par exemple, l'objet @code{Accidental} ne retient que le premier nombre (coin gauche). @item @code{staff-position} @cindex staff-position, propriété @code{staff-position} est une propriété de la @code{staff-symbol-referencer-interface}, qui s'applique aux objets positionnés par rapport à la portée. Elle indique, en demi-espace de portée, la position verticale des objets par rapport à la ligne médiane de la portée. C'est bien pratique pour résoudre des problèmes de collision entre des objets comme les silences valant mesure entière, les liaisons et les notes de différentes voix. @item @code{force-hshift} @cindex force-hshift, propriété Des notes très proches dans un accord, ou des notes simultanées dans différentes voix, peuvent être disposées sur deux colonnes, rarement plus, pour éviter que les têtes de notes ne se chevauchent. On parle alors de colonnes (ou empilement) de notes et un objet appelé @code{NoteColumn} est créé pour placer les notes sur la colonne. La propriété @code{force-hshift} appartient à @code{NoteColumn} (en réalité à la @code{note-column-interface}). Le fait de la modifier permet de déplacer un empilement selon l'unité appropriée aux colonnes de notes, à savoir la largeur des têtes de note de la première voix. Son utilisation est réservée à des situations complexes dans lesquelles les commandes habituelles @code{\shiftOn} (voir @ref{Instanciation explicite des voix}) ne suffisent plus à résoudre les conflits. Elle est alors préférable à l'utilisation de la propriété @code{extra-offset}, dans la mesure où on n'a pas besoin d'exprimer la distance en espace de portée et où le fait de déplacer les notes à l'intérieur ou à l'extérieur d'une @code{NoteColumn} affecte d'autres actions comme les fusions de notes. @end itemize @item Pour terminer, quand toutes les autres méthodes ont échoué, il est possible de repositionner verticalement les objets à la main par rapport à la ligne médiane de la portée, ou en les déplaçant à une distance donnée vers une nouvelle position. Les inconvénients sont qu'il faut individuellement, pour chaque objet, trouver les valeurs correctes de repositionnement souvent par tâtonnement et que, puisque le mouvement est opéré après que LilyPond a placé tous les autres objets, c'est à l'utilisateur de résoudre tous les problèmes de collision qui pourraient survenir. Et le pire avec cette méthode est que, le jour où la musique est modifiée, il faut de nouveau rechercher les valeurs de repositionnement. Les propriétés à utiliser pour ce type de repositionnement manuel sont : @table @code @item extra-offset @cindex extra-offset, propriété Cette propriété s'applique à tout objet acceptant la @code{grob-interface}. Elle reçoit une paire de nombres qui indiquent le déplacement supplémentaire dans le sens horizontal et vertical. Des nombres négatifs déplacent l'objet vers la gauche ou vers la droite. L'unité utilisée est l'espace de portée. Le déplacement supplémentaire intervient une fois que la composition des objets est achevée, si bien qu'un objet peut être repositionné à n'importe quel endroit sans perturber quoi que ce soit. @item positions @cindex positions, propriété Cette propriété est très utile pour ajuster manuellement l'inclinaison et la hauteur des barres de ligature, des liaisons et des nolets. Elle est suivie de deux nombres qui donnent la position des extrémités gauche et droite des barres, liaisons, etc. par rapport à la ligne médiane de la portée. L'unité de référence est l'intervalle de lignes de portée. Attention toutefois au fait que les liaisons et phrasés ne peuvent pas être repositionnés n'importe où. LilyPond commence par dresser la liste des emplacements possibles pour les liaisons et choisit par défaut la liaison qui @qq{semble la meilleure}. Si la propriété @code{positions} a été retouchée, la liaison la plus proche de la position demandée sera retenue dans la liste. @end table @end enumerate Il est possible qu'un objet ne dispose pas de toutes ces propriétés. Il est donc nécessaire de consulter la RPI pour vérifier quelles sont les propriétés disponibles pour l'objet en question. Voici une liste d'objets les plus couramment impliqués dans les collisions, avec le nom de l'objet à consulter dans la RPI afin de trouver les propriétés à retoucher pour obtenir un déplacement. @multitable @columnfractions .5 .5 @headitem Type d'objet @tab Nom d'objet @item Articulations @tab @code{Script} @item Barres de ligature @tab @code{Beam} @item Doigté @tab @code{Fingering} @item Liaisons de phrasé @tab @code{Slur} @item Liaisons de prolongation @tab @code{Tie} @item Nolets @tab @code{TupletBracket} @item Nuances (verticalement) @tab @code{DynamicLineSpanner} @item Nuances (horizontalement) @tab @code{DynamicText} @item Reprises / marques de texte @tab @code{RehearsalMark} @item Texte, par ex. @code{^"texte"} @tab @code{TextScript} @end multitable @node Correction des collisions d'objets @subsection Correction des collisions d'objets @translationof Fixing overlapping notation Voyons maintenant comment les propriétés décrites dans la section précédente peuvent nous aider à résoudre les collisions. @menu * La propriété padding:: * La propriété right-padding:: * La propriété staff-padding:: * La propriété self-alignment-X:: * La propriété staff-position:: * La propriété extra-offset:: * La propriété positions:: * La propriété force-hshift:: @end menu @node La propriété padding @unnumberedsubsubsec La propriété @code{padding} @translationof The padding property @cindex décalage (padding) @cindex résolution des chevauchements de notation @cindex chevauchement de notation En jouant sur la propriété @code{padding} (littéralement @qq{rembourrage}), on augmente (ou on diminue) la distance entre des symboles qui sont imprimés au-dessus ou en dessous des notes. @cindex Script, exemple de dérogation @cindex padding, exemple d'utilisation de la propriété @lilypond[quote,fragment,relative=1,verbatim] c2\fermata \override Script.padding = #3 b2\fermata @end lilypond @cindex MetronomeMark, exemple de dérogation @cindex padding, exemple d'utilisation de la propriété @lilypond[quote,fragment,relative=1,verbatim] % This will not work, see below: \override MetronomeMark.padding = #3 \tempo 4=120 c1 | % This works: \override Score.MetronomeMark.padding = #3 \tempo 4=80 d1 | @end lilypond Vous remarquerez dans le second exemple à quel point il est important de préciser le nom du contexte qui contient l'objet. Puisque l'objet @code{MetronomeMark} appartient au contexte @code{Score}, le fait de modifier la propriété dans le contexte @code{Voice} passera inaperçu. Pour plus de détails, voir @ruser{Modification de propriétés}. Si on augmente la propriété @code{padding} d'un objet alors que celui-ci fait partie d'un ensemble d'objets positionnés en fonction de leur @code{outside-staff-priority}, cet objet sera déplacé, ainsi que tous les autres objets du groupe. @node La propriété right-padding @unnumberedsubsubsec La propriété @code{right-padding} @translationof The right-padding property @cindex right-padding, propriété La propriété @code{right-padding} joue sur l'espacement entre une altération et la note sur laquelle elle porte. On ne l'utilise pas souvent, mais l'espacement par défaut peut se révéler inadéquat avec certaines altérations ou certains glyphes utilisés en musique microtonale. Le stencil de l'altération devra alors être construit sous la forme d'un @code{markup} qui contiendra le ou les symboles requis, comme ceci : @cindex Accidental, exemple de dérogation @cindex text, exemple d'utilisation de la propriété @cindex stencil, exemple d'utilisation de la propriété @cindex AccidentalPlacement, exemple de dérogation @cindex right-padding, exemple d'utilisation de la propriété @lilypond[quote,ragged-right,verbatim] sesquisharp = \markup { \sesquisharp } \relative c'' { c4 % This prints a sesquisharp but the spacing is too small \once \override Accidental.stencil = #ly:text-interface::print \once \override Accidental.text = #sesquisharp cis4 c % This improves the spacing \once \override Score.AccidentalPlacement.right-padding = #0.6 \once \override Accidental.stencil = #ly:text-interface::print \once \override Accidental.text = #sesquisharp cis4 | } @end lilypond @noindent Cette méthode utilise, pour le stencil des altérations, une retouche qui ne sera pas reprise par la suite. Le type de stencil est obligatoirement une procédure, qui consiste ici à imprimer le contenu de la propriété @code{text} de @code{Accidental}, déclaré comme étant un signe sesqui-dièse. Celui-ci est ensuite repoussé devant la tête de note par la retouche de @code{right-padding}. @node La propriété staff-padding @unnumberedsubsubsec La propriété @code{staff-padding} @translationof The staff-padding property @cindex alignement d'objets sur une ligne de base @cindex objets, alignement sur une ligne de base @code{staff-padding} sert à aligner des objets tels que des nuances sur une ligne fictive à une hauteur donnée par rapport à la portée plutôt qu'à une hauteur qui varie en fonction de la position de la note sur laquelle porte l'objet. Ce n'est pas une propriété de @code{DynamicText} mais de @code{DynamicLineSpanner}, car la ligne fictive est destinée à s'appliquer autant à @strong{toutes} les nuances, notamment celles qui sont créées comme des bandeaux en longueur (en anglais @emph{Spanners}). Tel est donc le moyen d'aligner les indications de nuance, comme dans cet exemple repris de la section précédente : @cindex DynamicText, exemple de dérogation @cindex extra-spacing-width, exemple d'utilisation de la propriété @cindex DynamicLineSpanner, exemple de dérogation @cindex staff-padding, exemple d'utilisation de la propriété @lilypond[quote,fragment,ragged-right,verbatim,relative=2] \dynamicUp % Extend width by 1 unit \override DynamicText.extra-spacing-width = #'(-0.5 . 0.5) % Align dynamics to a base line 2 units above staff \override DynamicLineSpanner.staff-padding = #2 a4\f b\mf c\mp b\p @end lilypond @node La propriété self-alignment-X @unnumberedsubsubsec La propriété @code{self-alignment-X} @translationof The self-alignment-X property L'exemple suivant montre comment résoudre une collision entre une indication de corde et une hampe, en alignant le coin droit sur le point de référence de la note parente : @cindex StringNumber, exemple de dérogation @cindex self-alignment-X, exemple d'utilisation de la propriété @lilypond[quote,fragment,ragged-right,verbatim,relative=3] \voiceOne \once \override StringNumber.self-alignment-X = #RIGHT @end lilypond @node La propriété staff-position @unnumberedsubsubsec La propriété @code{staff-position} @translationof The staff-position property @cindex collision d'objets à l'intérieur d'une portée Dans une voix, un silence valant une mesure entière peut chevaucher les notes d'une autre voix. Vu que ces silences sont centrés entre les deux barres de mesure, il serait très compliqué de programmer LilyPond pour repérer ces risques de collision dans la mesure où, normalement, toutes les collisions entre notes ou entre notes et silences se produisent sur des notes et silences simultanés. Voici un exemple de collision de ce type : @lilypond[quote,verbatim,fragment,ragged-right, relative=1] << { c4 c c c } \\ { R1 } >> @end lilypond Ici, la meilleure solution consiste à déplacer le symbole de pause vers le bas -- puisque cette pause appartient à la voix deux. Par défaut, dans la @code{\voiceTwo} (c'est-à-dire dans la seconde voix d'une construction @code{<<@{@dots{}@} \\ @{@dots{}@}>>}), la propriété @code{staff-position} est réglée sur @code{-4} pour les @code{MultiMeasureRest} ; nous avons donc besoin de la déplacer, disons, de quatre demi-intervalles vers le bas, ce qui donne @code{-8}. @cindex MultiMeasureRest, exemple de dérogation @cindex staff-position, exemple d'utilisation de la propriété @lilypond[quote,verbatim,fragment,ragged-right, relative=1] << { c4 c c c } \\ \override MultiMeasureRest.staff-position = #-8 { R1 } >> @end lilypond C'est mieux que d'utiliser, par exemple, @code{extra-offset}, car la ligne supplémentaire au-dessus du silence est insérée automatiquement. @node La propriété extra-offset @unnumberedsubsubsec La propriété @code{extra-offset} @translationof The extra-offset property @cindex positionnement des objets @cindex positionnement des grobs @cindex objets, positionnement @cindex grobs, positionnement La propriété @code{extra-offset} offre la possibilité de contrôler entièrement le placement d'un objet, aussi bien horizontalement que verticalement. Dans l'exemple suivant, la seconde indication de doigté est déplacée légèrement vers la gauche et de 1,8 intervalle de lignes vers le bas : @cindex Fingering, exemple de dérogation @cindex extra-offset, exemple d'utilisation de la propriété @lilypond[quote,fragment,relative=1,verbatim] \stemUp f4-5 \once \override Fingering.extra-offset = #'(-0.3 . -1.8) f4-5 @end lilypond @node La propriété positions @unnumberedsubsubsec La propriété @code{positions} @translationof The positions property @cindex contrôle des nolets, liaisons, phrasés et ligatures @cindex gestion manuelle des nolets, liaisons, phrasés et ligatures @cindex ligatures de nolet, gestion manuelle @cindex liaisons, gestion manuelle @cindex phrasés, gestion manuelle @cindex ligatures, gestion manuelle La propriété @code{positions} permet de contrôler manuellement la position et l'inclinaison des nolets, coulés, liaisons de phrasé et barres de ligature. Voici un exemple où la liaison de phrasé recouvre la liaison d'articulation : @lilypond[quote,verbatim,fragment,ragged-right,relative=2] a8 \( ( a'16 ) a \) @end lilypond @cindex PhrasingSlur, exemple de dérogation @cindex positions, exemple d'utilisation de la propriété @noindent Nous pourrions envisager de remonter quelque peu les extrémités de la liaison de phrasé. Commençons par repositionner l'extrémité gauche à 2,5 espaces de portée au-dessus de la ligne médiane, et la droite à 4,5 ; LilyPond choisira la courbe dont les extrémités seront les plus approchantes de celle déterminées : @lilypond[quote,verbatim,fragment,ragged-right,relative=2] \once \override PhrasingSlur.positions = #'(2.5 . 4.5) a8 \( ( a'16 ) a \) @end lilypond C'est déjà mieux, mais ne pourrait-on pas maintenant abaisser un peu l'extrémité droite de la liaison d'articulation ? Vous constaterez qu'il n'est pas possible d'y arriver, tout simplement parce qu'il n'y a pas de meilleur candidat ; la propriété @code{positions} n'est alors d'aucune utilité. Les liaisons, aussi bien de tenue que d'articulation ou de phrasé, peuvent se positionner et se dessiner tout en finesse lorsque nécessaire -- voir à ce sujet @ruser{Modification des liaisons}. Voici un autre exemple. Comme nous pouvons le constater, les barres de ligature chevauchent les liaisons de tenue : @lilypond[quote,verbatim,fragment,ragged-right] { \time 4/2 << { c'1 ~ c'2. e'8 f' } \\ { e''8 e'' e'' e'' e'' e'' e'' e'' f''2 g'' } >> << { c'1 ~ c'2. e'8 f' } \\ { e''8 e'' e'' e'' e'' e'' e'' e'' f''2 g'' } >> } @end lilypond @noindent On peut y remédier en déplaçant manuellement vers le haut les deux extrémités des ligatures de croches, non plus à 1,81 intervalle au-dessous de la ligne médiane mais, disons, à 1 : @cindex Beam, exemple de dérogation @cindex positions, exemple d'utilisation de la propriété @lilypond[quote,verbatim,fragment,ragged-right] { \time 4/2 << { c'1 ~ c'2. e'8 f' } \\ { \override Beam.positions = #'(-1 . -1) e''8 e'' e'' e'' e'' e'' e'' e'' f''2 g'' } >> << { c'1 ~ c'2. e'8 f' } \\ { e''8 e'' e'' e'' e'' e'' e'' e'' f''2 g'' } >> } @end lilypond @noindent Vous remarquerez que la retouche continue de s'appliquer au second bloc de croches de la première voix mais qu'il ne s'applique à aucune mesure de la deuxième voix. @node La propriété force-hshift @unnumberedsubsubsec La propriété @code{force-hshift} @translationof The force-hshift property Maintenant, nous sommes prêts à appliquer les dernières corrections à l'exemple de Chopin présenté à la fin de @ref{J'entends des Voix}, que nous avions laissé dans cet état : @lilypond[quote,verbatim,fragment,ragged-right] \new Staff \relative c'' { \key aes \major << { c2 aes4. bes8 } \\ { 2 des } \\ \\ { aes'2 f4 fes } >> | 1 | } @end lilypond @noindent La note intermédiaire du premier accord, le la bémol à la quatrième voix, doit rester dans le même empilement que la note haute. Pour y remédier, nous réglons le @code{force-hshift} -- qui est une propriété de @code{NoteColumn} -- de cette note sur zéro. Quant au second accord, il serait préférable que le fa s'aligne avec le la et que la note la plus basse se positionne un peu plus sur la droite pour éviter que les hampes se chevauchent. Pour cela, nous réglons le @code{force-hshift} au niveau du @code{NoteColumn} du ré bémol de telle sorte qu'il se déplace de la moitié d'un espace de portée vers la droite. Et voici le résultat final : @cindex NoteColumn, exemple de dérogation @cindex force-hshift, exemple d'utilisation de la propriété @lilypond[quote,verbatim,fragment,ragged-right] \new Staff \relative c'' { \key aes \major << { c2 aes4. bes8 } \\ { 2 \once \override NoteColumn.force-hshift = #0.5 des2 } \\ \\ { \override NoteColumn.force-hshift = #0 aes'2 f4 fes } >> | 1 | } @end lilypond @node Exemple concret @subsection Exemple concret @translationof Real music example Pour terminer ce chapitre consacré aux retouches, voici, étape par étape, la mise en forme d'un exemple concret nécessitant un certain nombre de retouches jusqu'à l'obtention du résultat attendu. Cet exemple a été choisi en raison des problèmes inhabituels de notation qu'il soulevait et pour vous apprendre à les résoudre grâce au Manuel de notation. Il n'est pas représentatif d'une opération normale de gravure ; que ces difficultés ne vous découragent donc pas ! Des difficultés comme celles-ci ne sont, heureusement, pas courantes ! Cet exemple est tiré de la Première Ballade de Chopin, Op. 23, mesures 6 à 9 ; cela correspond à la transition entre le Lento d'ouverture et le Moderato. Voici, pour commencer, ce à quoi nous voulons que la partition ressemble ; pour limiter les complications, nous n'avons pas fait apparaître les indications de nuance, de doigté ni de pédale. @c The following should appear as music without code @c This example should not be indexed @c line-width ensures no break @lilypond[quote,ragged-right,line-width=6\in] rhMusic = \relative c'' { \new Voice { r2 c4.\( g8 | \once \override Tie.staff-position = #3.5 bes1~ | \bar "||" \time 6/4 \mergeDifferentlyHeadedOn \mergeDifferentlyDottedOn bes2.^\markup { \bold "Moderato" } r8 << { c,8 d fis bes a } \new Voice { \voiceTwo c,8~ % Reposition the c2 to the right of the merged note \once \override NoteColumn.force-hshift = #1.0 % Move the c2 out of the main note column % so the merge will work \shiftOnn c2 } \new Voice { \voiceThree s8 % Stem on the d2 must be down to permit merging \stemDown % Stem on the d2 should be invisible \tweak Stem.transparent ##t \tweak Flag.transparent ##t d2 } \new Voice { \voiceFour s4 fis4. } >> | \mergeDifferentlyHeadedOff \mergeDifferentlyDottedOff g2.\) } } lhMusic = \relative c' { r2 2( | 1)\arpeggio | r2. d,,4 r4 r | r4 } \score { \new PianoStaff << \new Staff = "RH" << \key g \minor \rhMusic >> \new Staff = "LH" << \key g \minor \clef "bass" \lhMusic >> >> } @end lilypond Nous constatons tout d'abord que, dans la troisième mesure, la main droite compte quatre voix. Ce sont les cinq croches avec une barre, le do avec liaison, le ré blanche qui se fond avec le ré croche, et le fa dièse noire pointée qui se fond lui aussi avec la croche de même hauteur. Tout le reste se réduit à une seule voix. Le plus simple est donc de créer temporairement ces trois voix supplémentaires au moment opportun. Si vous avez oublié comment faire, reportez-vous à @ref{J'entends des Voix} et @ref{Instanciation explicite des voix}. Nous opterons ici pour une déclaration explicite des voix du passage polyphonique, puisque LilyPond est alors plus performant en matière d'évitement des collisions. Commençons par saisir les notes comme appartenant à deux variables, mettons en place l'ossature des portées dans un bloc @code{\Score} et voyons ce que LilyPond propose par défaut : @c line-width ensures no break @lilypond[quote,verbatim,ragged-right,line-width=6\in] rhMusic = \relative c'' { \new Voice { r2 c4. g8 | bes1~ | \time 6/4 bes2. r8 % Start polyphonic section of four voices << { c,8 d fis bes a } % continuation of main voice \new Voice { \voiceTwo c,8~ c2 } \new Voice { \voiceThree s8 d2 } \new Voice { \voiceFour s4 fis4. } >> | g2. % continuation of main voice } } lhMusic = \relative c' { r2 2 | 1 | r2. d,,4 r4 r | r4 } \score { \new PianoStaff << \new Staff = "RH" << \key g \minor \rhMusic >> \new Staff = "LH" << \key g \minor \clef "bass" \lhMusic >> >> } @end lilypond Toutes les notes sont correctes mais l'allure générale est loin d'être satisfaisante. La liaison se heurte à l'indication de mesure lors du changement de métrique, la ligature des croches n'est pas bonne dans la troisième mesure, les notes ne sont pas fusionnées et il manque plusieurs éléments de notation. Commençons par le plus simple. Nous pouvons corriger la ligature des croches en la créant manuellement et nous pouvons facilement ajouter les limites droite et gauche de la liaison de phrasé, puisque tout cela a déjà été traité dans le tutoriel. Voici le résultat : @c line-width ensures no break @lilypond[quote,verbatim,ragged-right,line-width=6\in] rhMusic = \relative c'' { \new Voice { r2 c4.\( g8 | bes1~ | \time 6/4 bes2. r8 % Start polyphonic section of four voices << { c,8 d fis bes a } % continuation of main voice \new Voice { \voiceTwo c,8~ c2 } \new Voice { \voiceThree s8 d2 } \new Voice { \voiceFour s4 fis4. } >> | g2.\) % continuation of main voice } } lhMusic = \relative c' { r2 2( | 1) | r2. d,,4 r4 r | r4 } \score { \new PianoStaff << \new Staff = "RH" << \key g \minor \rhMusic >> \new Staff = "LH" << \key g \minor \clef "bass" \lhMusic >> >> } @end lilypond La première mesure est maintenant correcte. La seconde contient un arpège et doit se terminer par une double barre. Comment faire, puisque cela n'a pas été traité dans le Manuel d'initiation ? C'est alors qu'il faut nous reporter au Manuel de notation. Quand on cherche @qq{arpège} et @qq{barre de mesure} dans l'index, on voit aisément qu'il faut ajouter @code{\arpeggio} à un accord pour produire un arpège et qu'une double barre est le résultat de la commande @code{\bar "||"}. Rien de plus facile ! Nous devons ensuite corriger la collision entre la liaison et l'indication de mesure. Le mieux est de déplacer la liaison vers le haut. La méthode pour déplacer les objets a déjà été présentée dans @ref{Déplacement d'objets}, et l'on sait que, pour des objets positionnés par rapport à la portée, il nous faut modifier leur propriété @code{staff-position}, exprimée en demi-intervalles de lignes par rapport à la ligne médiane de la portée. Voici donc la retouche à insérer juste devant la première note liée ; elle est censée déplacer la liaison vers le haut de 3,5 demi-intervalles de lignes au-dessus de la ligne médiane : @code{\once \override Tie.staff-position = #3.5} Cela s'adjoint à la deuxième mesure, pour donner : @c line-width ensures no break @lilypond[quote,verbatim,ragged-right,line-width=6\in] rhMusic = \relative c'' { \new Voice { r2 c4.\( g8 | \once \override Tie.staff-position = #3.5 bes1~ | \bar "||" \time 6/4 bes2. r8 % Start polyphonic section of four voices << { c,8 d fis bes a } % continuation of main voice \new Voice { \voiceTwo c,8~ c2 } \new Voice { \voiceThree s8 d2 } \new Voice { \voiceFour s4 fis4. } >> | g2.\) % continuation of main voice } } lhMusic = \relative c' { r2 2( | 1)\arpeggio | r2. d,,4 r4 r | r4 } \score { \new PianoStaff << \new Staff = "RH" << \key g \minor \rhMusic >> \new Staff = "LH" << \key g \minor \clef "bass" \lhMusic >> >> } @end lilypond Venons-en à la troisième mesure et au début de la section Moderato. Dans le Tutoriel, il est indiqué comment insérer du texte en gras à l'aide de la commande @code{\markup} ; pas de problème, du coup, pour ajouter @qq{Moderato} en gras. Mais comment faire pour fusionner les notes de différentes voix ? C'est là que le Manuel de notation peut nous venir en aide. Une recherche sur @qq{fusionnement de notes} dans l'index nous renvoie au chapitre @ruser{Résolution des collisions}, et plus précisément aux commandes permettant de fusionner des notes en fonction de leur type et selon qu'elles sont pointées ou non. Dans notre exemple, pour la durée de la polyphonie de la troisième mesure, nous avons besoin de fusionner deux types de notes ; grâce aux informations trouvées dans le Manuel de notation, nous ajoutons @example \mergeDifferentlyHeadedOn \mergeDifferentlyDottedOn @end example @noindent au début de cette section et @example \mergeDifferentlyHeadedOff \mergeDifferentlyDottedOff @end example @noindent à la fin, ce qui donne : @c line-width ensures no break @lilypond[quote,verbatim,ragged-right,line-width=6\in] rhMusic = \relative c'' { \new Voice { r2 c4.\( g8 | \once \override Tie.staff-position = #3.5 bes1~ | \bar "||" \time 6/4 bes2.^\markup { \bold "Moderato" } r8 \mergeDifferentlyHeadedOn \mergeDifferentlyDottedOn % Start polyphonic section of four voices << { c,8 d fis bes a } % continuation of main voice \new Voice { \voiceTwo c,8~ c2 } \new Voice { \voiceThree s8 d2 } \new Voice { \voiceFour s4 fis4. } >> | \mergeDifferentlyHeadedOff \mergeDifferentlyDottedOff g2.\) % continuation of main voice } } lhMusic = \relative c' { r2 2( | 1)\arpeggio | r2. d,,4 r4 r | r4 } \score { \new PianoStaff << \new Staff = "RH" << \key g \minor \rhMusic >> \new Staff = "LH" << \key g \minor \clef "bass" \lhMusic >> >> } @end lilypond Ces retouches ont permis de fusionner les deux fa dièse mais pas les deux ré. Pourquoi ? La réponse se trouve dans la même section du Manuel de notation : les notes à fusionner doivent avoir des hampes dans des directions opposées et deux notes ne peuvent pas être fusionnées s'il y a une troisième note dans la même colonne. Ici, les deux ré ont leur hampe orientée vers le haut et il y a une troisième note, do. Nous savons changer l'orientation de la hampe avec @code{\stemDown} et le Manuel de notation nous indique également comment déplacer le do -- en produisant un décalage grâce à l'une des commandes @code{\shift}. Mais laquelle ? Le do appartient à la deuxième voix et n'est pas décalé ; les deux ré appartiennent respectivement à la première et à la troisième voix, et l'un n'est pas décalé tandis que l'autre l'est. Il nous faut donc décaler largement le do avec la commande @code{\shiftOnn} pour éviter une interférence avec les deux ré. Voici ce que donnent ces modifications : @cindex Tie, exemple de dérogation @cindex staff-position, exemple d'utilisation de la propriété @c line-width ensures no break @lilypond[quote,verbatim,ragged-right,line-width=6\in] rhMusic = \relative c'' { \new Voice { r2 c4.\( g8 | \once \override Tie.staff-position = #3.5 bes1~ | \bar "||" \time 6/4 bes2.^\markup { \bold "Moderato" } r8 \mergeDifferentlyHeadedOn \mergeDifferentlyDottedOn % Start polyphonic section of four voices << { c,8 d fis bes a } % continuation of main voice \new Voice { \voiceTwo % Move the c2 out of the main note column % so the merge will work c,8~ \shiftOnn c2 } \new Voice { \voiceThree % Stem on the d2 must be down to permit merging s8 \stemDown d2 } \new Voice { \voiceFour s4 fis4. } >> | \mergeDifferentlyHeadedOff \mergeDifferentlyDottedOff g2.\) % continuation of main voice } } lhMusic = \relative c' { r2 2( | 1)\arpeggio | r2. d,,4 r4 r | r4 } \score { \new PianoStaff << \new Staff = "RH" << \key g \minor \rhMusic >> \new Staff = "LH" << \key g \minor \clef "bass" \lhMusic >> >> } @end lilypond Pas loin ! Il ne reste plus que deux problèmes : les ré une fois fusionnés ne devraient plus avoir de hampe vers le bas, et le do serait mieux à la droite des ré. Nous savons remédier à ces deux problèmes grâce aux retouches précédentes : nous allons rendre la hampe transparente et déplacer le do avec la propriété @code{force-hshift}. Et voici le résultat final : @cindex NoteColumn, exemple de dérogation @cindex force-hshift, exemple d'utilisation de la propriété @cindex Stem, exemple de dérogation @cindex transparent, exemple d'utilisation de la propriété @c line-width ensures no break @lilypond[quote,verbatim,ragged-right,line-width=6\in] rhMusic = \relative c'' { \new Voice { r2 c4.\( g8 | \once \override Tie.staff-position = #3.5 bes1~ | \bar "||" \time 6/4 bes2.^\markup { \bold "Moderato" } r8 \mergeDifferentlyHeadedOn \mergeDifferentlyDottedOn % Start polyphonic section of four voices << { c,8 d fis bes a } % continuation of main voice \new Voice { \voiceTwo c,8~ % Reposition the c2 to the right of the merged note \once \override NoteColumn.force-hshift = #1.0 % Move the c2 out of the main note column % so the merge will work \shiftOnn c2 } \new Voice { \voiceThree s8 % Stem on the d2 must be down to permit merging \stemDown % Stem on the d2 should be invisible \tweak Stem.transparent ##t \tweak Flag.transparent ##t d2 } \new Voice { \voiceFour s4 fis4. } >> | \mergeDifferentlyHeadedOff \mergeDifferentlyDottedOff g2.\) % continuation of main voice } } lhMusic = \relative c' { r2 2( | 1)\arpeggio | r2. d,,4 r4 r | r4 } \score { \new PianoStaff << \new Staff = "RH" << \key g \minor \rhMusic >> \new Staff = "LH" << \key g \minor \clef "bass" \lhMusic >> >> } @end lilypond @node Autres retouches @section Autres retouches @translationof Further tweaking @menu * Autres utilisations des retouches:: * Utilisation de variables dans les retouches:: * Feuilles de style:: * Autres sources de documentation:: * Retouches avancées avec Scheme:: @end menu @node Autres utilisations des retouches @subsection Autres utilisations des retouches @translationof Other uses for tweaks @menu * Liaison entre plusieurs voix:: * Rendu MIDI d'un point d'orgue:: @end menu @cindex transparent, utilisation de la propriété @cindex création d'objet invisible @cindex suppression d'objets @cindex objets, suppression d' @cindex masquage d'objets @cindex objets, masquage d' @cindex invisibles, objets @cindex objets, invisibles @cindex liaison de tenue avec changement de voix @node Liaison entre plusieurs voix @unnumberedsubsubsec Liaison entre plusieurs voix @translationof Tying notes across voices Voici un exemple qui montre comment créer une liaison de prolongation entre des notes appartenant à des voix différentes. En temps normal, seules deux notes appartenant à une même voix peuvent être ainsi liées. La solution consiste à utiliser deux voix, dont l'une avec les notes liées @lilypond[quote,fragment,relative=2] << { b8~ b8\noBeam } \\ { b[ g8] } >> @end lilypond @noindent et à rendre transparente la première hampe de cette voix ; on a alors l'impression que la liaison couvre les deux voix. @cindex Stem, exemple de dérogation @cindex transparent, exemple d'utilisation de la propriété @lilypond[quote,fragment,relative=2,verbatim] << { \tweak Stem.transparent ##t \tweak Flag.transparent ##t b8~ b\noBeam } \\ { b8[ g] } >> @end lilypond Pour être sûr que la hampe que nous avons rendue transparente n'empiète pas trop sur le trait de liaison, nous pouvons l'allonger en réglant la longueur (@code{length}) sur @code{8}, @lilypond[quote,fragment,relative=2,verbatim] << { \tweak Stem.transparent ##t \tweak Flag.transparent ##t \tweak Stem.length #8 b8~ b8\noBeam } \\ { b[ g8] } >> @end lilypond @funindex \single @cindex affinage généré par une dérogation Nous aurions pu, pour déroger à la transparence d'un objet graphique, utiliser le raccourci @code{\omit} que nous avons vu plus haut. L'affinage constitue une opération différente en ceci qu'il n'affecte que les propriétés générées par une expression musicale unique. Nous pourrions tout à fait convertir des dérogations en affinages à l'aide d'un @code{\single} et ré-écrire l'exemple précédent de cette manière : @lilypond[quote,fragment,relative=2,verbatim] << { \single \hide Stem \single \hide Flag \tweak Stem.length #8 b8~ b\noBeam } \\ { b8[ g] } >> @end lilypond Dans ce cas particulier, la différence avec un @code{\once \hide} n'est pas flagrante. Elle prend cependant toute son importance lorsque plusieurs objets de retrouvent au même instant musical -- comme les têtes des notes d'un accord. En effet, la présence d'un @code{\once} sera répercutée à tous les objets, alors qu'un @code{\single} n'affectera, lui, qu'un seul objet, celui généré par l'expression musicale qui le suit directement. @node Rendu MIDI d'un point d'orgue @unnumberedsubsubsec Rendu MIDI d'un point d'orgue @translationof Simulating a fermata in MIDI @cindex stencil, utilisation de la propriété @cindex point d'orgue, rendu en MIDI En ce qui concerne les objets extérieurs à la portée, quand on veut les faire disparaître de la partition imprimée, il est généralement préférable de modifier leur propriété @code{stencil} plutôt que leur propriété @code{transparent}. Le fait d'attribuer à la propriété @code{stencil} d'un objet la valeur @code{#f} supprimera entièrement celui-ci de la partition. Il ne risquera donc pas de gêner le placement d'autres objets. Par exemple, si nous voulons changer le réglage de métronome pour simuler un point d'orgue dans le fichier MIDI, nous ne voulons surtout pas que cette indication métronomique apparaisse sur la partition ni qu'elle influence l'espacement entre les deux systèmes ou la position des annotations voisines sur la portée. Le fait d'attribuer à la propriété @code{stencil} la valeur @code{#f} est donc la bonne solution. Nous montrons ci-dessous le résultat des deux méthodes : @cindex MetronomeMark, exemple de dérogation @cindex transparent, exemple d'utilisation de la propriété @lilypond[quote,verbatim,ragged-right] \score { \relative c'' { % Visible tempo marking \tempo 4=120 a4 a a \once \hide Score.MetronomeMark % Invisible tempo marking to lengthen fermata in MIDI \tempo 4=80 a4\fermata | % New tempo for next section \tempo 4=100 a4 a a a | } \layout { } \midi { } } @end lilypond @cindex MetronomeMark, exemple de dérogation @cindex stencil, exemple d'utilisation de la propriété @lilypond[quote,verbatim,ragged-right] \score { \relative c'' { % Visible tempo marking \tempo 4=120 a4 a a \once \omit Score.MetronomeMark % Invisible tempo marking to lengthen fermata in MIDI \tempo 4=80 a4\fermata | % New tempo for next section \tempo 4=100 a4 a a a | } \layout { } \midi { } } @end lilypond @noindent Les deux méthodes permettent d'enlever l'indication métronomique qui allonge le point d'orgue de la partition, et toutes deux modifient le rythme MIDI comme souhaité mais, dans la première, l'indication métronomique transparente repousse vers le haut l'indication de tempo, contrairement à la seconde (avec le stencil désactivé) qui la laisse à sa place. @seealso Glossaire musicologique : @rglosnamed{system,système}. @node Utilisation de variables dans les retouches @subsection Utilisation de variables dans les retouches @translationof Using variables for layout adjustments @cindex variables, utilisation dans les retouches @cindex utilisation de variables dans les retouches @cindex retouches et utilisation de variables Les commandes de retouche sont souvent longues et pénibles à taper, et ne tolèrent pas la moindre erreur. Lorsqu'on a besoin de faire plusieurs fois les mêmes retouches, il est préférable de définir des variables qui les contiennent. Imaginons que nous voulions accentuer certains mots dans des paroles en les mettant en italique. Au lieu des commandes @code{\italic} et @code{\bold}, qui ne fonctionnent dans les paroles que si elles sont enchâssées dans un @code{\markup} -- ce qui les rend pénibles à saisir -- pouvons-nous employer les commandes @code{\override} et @code{\revert} ? @example @code{\override Lyrics.LyricText.font-shape = #'italic} @code{\override Lyrics.LyricText.font-series = #'bold} @code{\revert Lyrics.LyricText.font-shape} @code{\revert Lyrics.LyricText.font-series} @end example Là encore, ce serait extrêmement pénible à saisir, surtout s'il y avait beaucoup de mots à retoucher de cette façon. Plutôt que cette solution, nous déclarons ces commandes comme étant deux variables, et les utilisons comme ci-après -- quoique on choisirait sans doute pour les variables des noms plus courts pour simplifier la frappe. Par ailleurs, le fait de recourir à une variable ne nous expose plus à l'oubli des espaces entourant les points lorsqu'explicités au beau milieu d'un bloc @code{\lyricmode} ! @cindex LyricText, exemple de dérogation @cindex font-shape, exemple d'utilisation de la propriété @cindex font-series, exemple d'utilisation de la propriété @lilypond[quote,verbatim] emphasize = { \override Lyrics.LyricText.font-shape = #'italic \override Lyrics.LyricText.font-series = #'bold } normal = { \revert Lyrics.LyricText.font-shape \revert Lyrics.LyricText.font-series } global = { \key c \major \time 4/4 \partial 4 } SopranoMusic = \relative c' { c4 | e4. e8 g4 g | a4 a g } AltoMusic = \relative c' { c4 | c4. c8 e4 e | f4 f e } TenorMusic = \relative c { e4 | g4. g8 c4. b8 | a8 b c d e4 } BassMusic = \relative c { c4 | c4. c8 c4 c | f8 g a b c4 } VerseOne = \lyrics { E -- | ter -- nal \emphasize Fa -- ther, | \normal strong to save, } VerseTwo = \lyricmode { O | \emphasize Christ, \normal whose voice the | wa -- ters heard, } VerseThree = \lyricmode { O | \emphasize Ho -- ly Spi -- rit, | \normal who didst brood } VerseFour = \lyricmode { O | \emphasize Tri -- ni -- ty \normal of | love and pow'r } \score { \new ChoirStaff << \new Staff << \clef "treble" \new Voice = "Soprano" { \voiceOne \global \SopranoMusic } \new Voice = "Alto" { \voiceTwo \AltoMusic } \new Lyrics \lyricsto "Soprano" { \VerseOne } \new Lyrics \lyricsto "Soprano" { \VerseTwo } \new Lyrics \lyricsto "Soprano" { \VerseThree } \new Lyrics \lyricsto "Soprano" { \VerseFour } >> \new Staff << \clef "bass" \new Voice = "Tenor" { \voiceOne \TenorMusic } \new Voice = "Bass" { \voiceTwo \BassMusic } >> >> } @end lilypond @node Feuilles de style @subsection Feuilles de style @translationof Style sheets La sortie que produit LilyPond peut être largement modifiée -- voir @ref{Retouche de partition} pour plus de détails. Mais que faire si vous avez beaucoup de fichiers auxquels vous souhaitez appliquer vos retouches ? Ou si vous souhaitez simplement séparer les retouches de la musique elle-même ? Rien de plus facile. Prenons un exemple. Ne vous inquiétez pas si vous ne comprenez pas les parties avec tous les @code{#()}. Celles-ci sont expliquées dans @ref{Retouches avancées avec Scheme}. @lilypond[quote,verbatim,ragged-right] mpdolce = #(make-dynamic-script #{ \markup { \hspace #0 \translate #'(5 . 0) \line { \dynamic "mp" \text \italic "dolce" } } #}) inst = #(define-music-function (parser location string) (string?) #{ <>^\markup \bold \box #string #}) \relative c'' { \tempo 4=50 a4.\mpdolce d8 cis4--\glissando a | b4 bes a2 | \inst "Clarinet" cis4.\< d8 e4 fis | g8(\! fis)-. e( d)-. cis2 | } @end lilypond On peut faire quelque chose pour les définitions de @code{mpdolce} et @code{inst}. Elles produisent le résultat que nous désirons, mais nous pourrions aussi vouloir les utiliser dans une autre pièce. Il suffirait de les copier et coller au début de chaque fichier, mais c'est fastidieux. De plus, cela laisse les définitions dans nos fichiers de musique, et je trouve personnellement tous ces @code{#()} assez laids. Stockons-les dans un autre fichier : @example %%% enregistrez ceci dans un fichier nommé "definitions.ily" mpdolce = #(make-dynamic-script #@{ \markup @{ \hspace #0 \translate #'(5 . 0) \line @{ \dynamic "mp" \text \italic "dolce" @} @} #@}) inst = #(define-music-function (parser location string) (string?) #@{ <>^\markup \bold \box #string #@}) @end example Nous rappellerons ce fichier par une simple commande @code{\include} au début de notre fichier de musique. Lui attribuer l'extension @code{.ily} nous permet de distinguer aisément qu'il s'agit d'un fichier voué à être inclus dans un fichier maître ; il n'est pas destiné à être compilé isolément.@* Maintenant, modifions notre musique (enregistrez ce fichier sous @file{musique.ly}). @c We have to do this awkward example/lilypond-non-verbatim @c because we can't do the \include stuff in the manual. @example \include "definitions.ily" \relative c'' @{ \tempo 4=50 a4.\mpdolce d8 cis4--\glissando a | b4 bes a2 | \inst "Clarinet" cis4.\< d8 e4 fis | g8(\! fis)-. e( d)-. cis2 | @} @end example @lilypond[quote,ragged-right] mpdolce = #(make-dynamic-script #{ \markup { \hspace #0 \translate #'(5 . 0) \line { \dynamic "mp" \text \italic "dolce" } } #}) inst = #(define-music-function (parser location string) (string?) #{ <>^\markup \bold \box #string #}) \relative c'' { \tempo 4=50 a4.\mpdolce d8 cis4--\glissando a | b4 bes a2 | \inst "Clarinet" cis4.\< d8 e4 fis | g8(\! fis)-. e( d)-. cis2 | } @end lilypond C'est mieux, mais effectuons encore quelques retouches. Le glissando est peu visible, c'est pourquoi nous allons l'épaissir et le rapprocher des têtes de note. Déplaçons l'indication métronomique au-dessus de la clef, au lieu de la laisser au-dessus de la première note. Et pour finir, mon professeur de composition déteste les chiffrages de mesure en @qq{C}, nous allons donc le transformer en @qq{4/4}. Cependant, ne changez pas le fichier @file{musique.ly}. Remplacez le fichier @file{definitions.ily} par ceci : @example %%% definitions.ily mpdolce = #(make-dynamic-script #@{ \markup @{ \hspace #0 \translate #'(5 . 0) \line @{ \dynamic "mp" \text \italic "dolce" @} @} #@}) inst = #(define-music-function (parser location string) (string?) #@{ <>^\markup \bold \box #string #@}) \layout@{ \context @{ \Score \override MetronomeMark.extra-offset = #'(-5 . 0) \override MetronomeMark.padding = #'3 @} \context @{ \Staff \override TimeSignature.style = #'numbered @} \context @{ \Voice \override Glissando.thickness = #3 \override Glissando.gap = #0.1 @} @} @end example @lilypond[quote,ragged-right] mpdolce = #(make-dynamic-script #{ \markup { \hspace #0 \translate #'(5 . 0) \line { \dynamic "mp" \text \italic "dolce" } } #}) inst = #(define-music-function (parser location string) (string?) #{ <>^\markup \bold \box #string #}) \layout{ \context { \Score \override MetronomeMark.extra-offset = #'(-5 . 0) \override MetronomeMark.padding = #'3 } \context { \Staff \override TimeSignature.style = #'numbered } \context { \Voice \override Glissando.thickness = #3 \override Glissando.gap = #0.1 } } \relative c'' { \tempo 4=50 a4.\mpdolce d8 cis4--\glissando a | b4 bes a2 | \inst "Clarinet" cis4.\< d8 e4 fis | g8(\! fis)-. e( d)-. cis2 | } @end lilypond C'est encore mieux ! Mais supposons maintenant que je veuille publier cette pièce. Mon professeur de composition n'aime pas les chiffrages de mesure en @qq{C}, mais moi je les aime bien. Copions l'actuel @file{definitions.ily} dans le fichier @file{publication-web.ily}, et modifions ce dernier. Puisque la musique est destinée à produire un fichier PDF affiché sur écran, nous allons aussi augmenter la taille globale de police. @example %%% web-publish.ily mpdolce = #(make-dynamic-script #@{ \markup @{ \hspace #0 \translate #'(5 . 0) \line @{ \dynamic "mp" \text \italic "dolce" @} @} #@}) inst = #(define-music-function (parser location string) (string?) #@{ <>^\markup \bold \box #string #@}) #(set-global-staff-size 23) \layout@{ \context @{ \Score \override MetronomeMark.extra-offset = #'(-5 . 0) \override MetronomeMark.padding = #'3 @} \context @{ \Staff @} \context @{ \Voice \override Glissando.thickness = #3 \override Glissando.gap = #0.1 @} @} @end example @lilypond[quote,ragged-right] mpdolce = #(make-dynamic-script #{ \markup { \hspace #0 \translate #'(5 . 0) \line { \dynamic "mp" \text \italic "dolce" } } #}) inst = #(define-music-function (parser location string) (string?) #{ <>^\markup \bold \box #string #}) #(set-global-staff-size 23) \layout{ \context { \Score \override MetronomeMark.extra-offset = #'(-5 . 0) \override MetronomeMark.padding = #'3 } \context { \Voice \override Glissando.thickness = #3 \override Glissando.gap = #0.1 } } \relative c'' { \tempo 4=50 a4.\mpdolce d8 cis4--\glissando a | b4 bes a2 | \inst "Clarinet" cis4.\< d8 e4 fis | g8(\! fis)-. e( d)-. cis2 | } @end lilypond Il ne nous reste plus qu'à remplacer @code{\include "definitions.ily"} par @code{\include "publication-web.ily"} dans notre fichier de musique. Il est possible, bien sûr, de rendre cela encore plus pratique. Nous pourrions créer un fichier @file{definitions.ily} qui ne contiendrait que les définitions de @code{mpdolce} et de @code{inst}, un fichier @file{publication-web.ily} qui ne contiendrait que la section @code{layout} décrite ci-dessus et un fichier @file{universite.ily} qui ne contiendrait que les retouches pour produire le résultat que mon professeur préfère. Le début du fichier @file{musique.ly} ressemblerait alors à @example \include "definitions.ily" %%% Décommentez seulement une de ces deux lignes ! \include "publication-web.ily" %\include "universite.ily" @end example Cette approche peut être utile même si vous ne produisez qu'un seul jeu de partitions. J'utilise personnellement une demi-douzaine de fichiers de @qq{feuille de style} pour mes projets. Je commence chaque fichier de musique par @code{\include "../global.ily"} qui contient : @example %%% global.ily \version @w{"@version{}"} #(ly:set-option 'point-and-click #f) \include "../init/init-defs.ly" \include "../init/init-mise-en-page.ly" \include "../init/init-en-tetes.ly" \include "../init/init-papier.ly" @end example @node Autres sources de documentation @subsection Autres sources de documentation @translationof Other sources of information La référence des propriétés internes contient beaucoup d'informations sur LilyPond. Cependant vous pouvez en découvrir encore plus en consultant les fichiers internes de LilyPond. Pour cela, il vous faut d'abord connaître le répertoire @emph{ad hoc} sur votre système. L'emplacement du répertoire dépend (a) du fait que, pour vous procurer LilyPond, vous avez téléchargé un paquet précompilé sur lilypond.org ou vous l'avez installé grâce à votre gestionnaire de paquetages (c'est-à-dire distribué avec GNU/Linux ou installé avec fink ou cygwin), ou encore vous l'avez compilé directement à partir des sources ; et (b) du système d'exploitation sur lequel il tourne. @subsubsubheading Téléchargé depuis lilypond.org @itemize @bullet @item GNU/Linux @example @file{@var{INSTALLDIR}/lilypond/usr/@/share/lilypond/current/} @end example @item MacOS X @example @file{@var{INSTALLDIR}/LilyPond.app/Contents/@/Resources/share/lilypond/current/} @end example Pour accéder à ce dossier, deux possibilités : soit, dans un Terminal, taper @code{cd} suivi du chemin complet ci-dessus ; soit Control-cliquer (ou clic droit) sur l'application LilyPond et sélectionner @qq{Afficher le contenu du paquet}. @item Windows Dans l'Explorateur Windows, voir @example @file{@var{INSTALLDIR}/LilyPond/usr/@/share/lilypond/current/} @end example @end itemize @subsubsubheading Installé par un gestionnaire de paquetages ou compilé d'après les sources @code{@var{PREFIX}/share/lilypond/@var{X.Y.Z}/}, où @var{PREFIX} est déterminé par votre gestionnaire de paquetages ou par le script @code{configure}, et @var{X.Y.Z} représente le numéro de version de LilyPond. @smallspace Dans ce répertoire, deux sous-répertoires sont particulièrement intéressants : @itemize @item @code{ly/} -- contient les fichiers en format LilyPond @item @code{scm/} -- contient les fichiers en format Scheme @end itemize Commençons par examiner quelques fichiers contenus dans @file{ly/}. Nous ouvrons @file{ly/property-init.ly} dans un éditeur de texte -- celui que vous avez l'habitude d'utiliser pour les fichiers @file{.ly} fera très bien l'affaire. Ce fichier contient les définitions de toutes les commandes standard prédéfinies de LilyPond, comme @code{\stemUp} et @code{\slurDotted}. Vous pouvez constater que ce n'est rien d'autre que des définitions de variables composées d'un ou plusieurs groupes de commandes @code{\override}. Par exemple, @code{\tieDotted} est défini comme : @example tieDotted = @{ \override Tie.dash-period = #0.75 \override Tie.dash-fraction = #0.1 @} @end example Si vous n'aimez pas les valeurs par défaut, les commandes prédéfinies peuvent être facilement redéfinies, comme n'importe quelle autre variable, en tête de votre fichier d'entrée. Voici les fichiers les plus utiles dans le répertoire @file{ly/} : @multitable @columnfractions .4 .6 @headitem Nom de fichier @tab Contenu @item @file{ly/engraver-init.ly} @tab Définition des contextes de graveurs @item @file{ly/paper-defaults-init.ly} @tab Réglages papier par défaut @item @file{ly/performer-init.ly} @tab Définition des contextes d'interprétation @item @file{ly/property-init.ly} @tab Définition de toutes les commandes prédéfinies courantes @item @file{ly/spanner-init.ly} @tab Définition des commandes prédéfinies pour les bandeaux @end multitable Les autres réglages (comme les définitions de commandes @emph{markup}) sont conservés comme fichiers @file{.scm} (Scheme). Le langage de programmation Scheme offre une interface programmable dans le processus interne de LilyPond. De plus amples explications sur ces fichiers dépasseraient le cadre de ce manuel dans la mesure où elles requièrent la connaissance du langage Scheme. Les utilisateurs qui souhaiteraient comprendre le fonctionnement de ces fichiers de configuration doivent être avertis que des connaissances techniques substantielles et beaucoup de temps sont nécessaires (voir le @rextend{Tutoriel Scheme}). Si c'est votre cas, les fichiers Scheme les plus utiles à connaître sont : @multitable @columnfractions .4 .6 @headitem Nom de fichier @tab Contenu @item @file{scm/auto-beam.scm} @tab Règles par défaut des ligatures subalternes @item @file{scm/define-grobs.scm} @tab Réglages par défaut des propriétés de @emph{grobs} @item @file{scm/define-markup-commands.scm} @tab Spécification de toutes les commandes de @emph{markup} @item @file{scm/midi.scm} @tab Réglages par défaut pour les sorties MIDI @item @file{scm/output-lib.scm} @tab Réglages affectant l'apparence des frets, couleurs, altérations, barres de mesure, etc. @item @file{scm/parser-clef.scm} @tab Définition des clefs prises en charge @item @file{scm/script.scm} @tab Réglages par défaut des articulations @end multitable @node Retouches avancées avec Scheme @subsection Retouches avancées avec Scheme @translationof Advanced tweaks with Scheme Nous avons vu à quel point le résultat obtenu avec LilyPond peut être largement personnalisé à l'aide de commandes comme @code{\override} et @code{\tweak}. Et pourtant l'utilisation de Scheme ouvre des possibilités encore plus grandes. Le code écrit dans le langage de programmation Scheme peut être intégré directement dans le processus interne de LilyPond. Bien sûr, il faut pour cela connaître un minimum de programmation en langage Scheme. Pour des explications complètes là-dessus, consultez le @rextend{Tutoriel Scheme}. En guise d'illustration -- et ce n'est qu'une possibilité parmi tant d'autres -- nous allons attribuer à une propriété non pas une valeur préétablie mais une procédure Scheme qui sera lancée à chaque utilisation de la propriété par LilyPond. De cette façon, nous obtenons un réglage dynamique de la propriété par le simple fait d'invoquer la procédure. Dans cet exemple, nous colorons les têtes de notes en fonction de leur position sur la portée. @cindex x11-color, exemple d'utilisation de la fonction @cindex NoteHead, exemple de dérogation @cindex color, détermination de la propriété par une procédure Scheme @lilypond[quote,verbatim,ragged-right] #(define (color-notehead grob) "Color the notehead according to its position on the staff." (let ((mod-position (modulo (ly:grob-property grob 'staff-position) 7))) (case mod-position ;; Return rainbow colors ((1) (x11-color 'red )) ; for C ((2) (x11-color 'orange )) ; for D ((3) (x11-color 'yellow )) ; for E ((4) (x11-color 'green )) ; for F ((5) (x11-color 'blue )) ; for G ((6) (x11-color 'purple )) ; for A ((0) (x11-color 'violet )) ; for B ))) \relative c' { % Arrange to obtain color from color-notehead procedure \override NoteHead.color = #color-notehead a2 b | c2 d | e2 f | g2 a | } @end lilypond Vous trouverez dans @rextend{Fonctions de rappel} d'autres exemples d'utilisation de ces interfaces programmables.