[ < ] [ > ]   [ << ] [Plus haut] [ >> ]         [Racine] [Table des matières] [Index] [ ? ]

3.3 Travail sur des fichiers texte

@translationof Working with input files


[ < ] [ > ]   [ << ] [Plus haut] [ >> ]         [Racine] [Table des matières] [Index] [ ? ]

3.3.1 Insertion de fichiers LilyPond

@translationof Including LilyPond files

Lorsqu’un projet prend de l’importance en volume, il est judicieux de le scinder en plusieurs fichiers, auxquels vous ferez référence avec un simple

 
\include "autrefichier.ly"

Une ligne \include "autrefichier.ly" dans un fichier revient à recopier intégralement le contenu de ‘autrefichier.ly’ à l’endroit même ou est placée l’instruction \include. Vous pouvez par exemple écrire un fichier individuel par instrument, puis les regrouper pour former le fichier « conducteur ». Les différentes variables définies dans les fichiers séparés seront normalement reprises et utilisables dans le fichier formant le conducteur. Les sections balisées dans les fichiers individuels peuvent être réutilisées en différents endroit de la partition, comme expliqué à la rubrique Différentes éditions à partir d’une même source.

Lorsque le fichier auquel il est fait référence se trouve dans le même répertoire, donner seulement son nom en argument à la commande \include suffit. S’il se trouve ailleurs, vous devrez indiquer le chemin d’accès, absolu ou relatif, en respectant toutefois la syntaxe UNIX – autrement dit, le séparateur de répertoire est une oblique normale / et non l’oblique inverse \ de DOS ou Windows. Par exemple, si le fichier ‘truc.ly’ se trouve dans le répertoire supérieur au répertoire de travail, la ligne devra être

 
\include "../truc.ly"

ou bien, si les fichiers correspondant aux parties d’orchestre se trouvent dans le sous-répertoire ‘parties’ relativement au répertoire courant, vous devrez mentionner

 
\include "parties/VI.ly"
\include "parties/VII.ly"
etc.

Les fichiers à inclure peuvent eux-mêmes contenir des instructions \include. Ces instructions \include de second niveau seront, par défaut, interprétées par rapport à leur situation dans l’arborescence. Tel sera, par exemple, le cas d’une biblothèque générale libA créée pour utiliser des sous-fichiers à l’aide d’inclusions dans un fichier catalogue, comme ici :

 
libA/
  libA.ly
  A1.ly
  A2.ly
  …

puis le fichier catalogue, libA.ly, qui contient

 
\include "A1.ly"
\include "A2.ly"
…

Tout fichier .ly peut désormais consulter l’intégralité de cette bibliothèque grâce à un simple

 
\include "~/libA/libA.ly"

Vous pouvez toutefois influer sur ce comportement de manière globale à l’aide de l’option ‘-drelative-includes=#f’ en ligne de commande ou en ajoutant une clause #(ly:set-option 'relative-includes #f) en tête du fichier principal. En pareil cas, le chemin à suivre pour chacune des commandes \include sera pris relativement au fichier principal. Selon l’endroit où relative-includes est valorisé à #t ou #f, la commande \include permettra d’incorporer des fichiers contenus dans l’arborescence du répertoire principal et des fichiers situés ailleurs.

Vous pouvez inclure des fichiers dont vous spécifierez le chemin d’accès sur la ligne de commande au moment de lancer la compilation. L’appel à ces fichiers ne mentionnera alors que leur nom. Par exemple, si vous voulez compiler avec cette méthode le fichier ‘principal.ly’ qui inclut des fichiers situés dans le sous-répertoire ‘parties’, placez vous dans le répertoire contenant ‘principal.ly’, puis tapez

 
lilypond --include=parties principal.ly

tout en ayant bien dans ‘principal.ly’

 
\include "VI.ly"
\include "VII.ly"
 etc.

Lorsqu’un fichier est voué à être inclus dans nombre de partitions, vous pouvez le placer dans le répertoire de LilyPond ‘../ly’. Attention : ce répertoire varie selon votre installation, comme indiqué au chapitre (learning)Autres sources de documentation section ‘Autres sources de documentation’ dans Manuel d’initiation. Ce fichier sera inclus dès lors que vous fournirez uniquement son nom en argument à la fonction \include. C’est par exemple le cas du fichier de définition particulier ‘gregorian.ly’.

Au moment où vous lancez LilyPond, un certain nombre de fichiers se retrouvent inclus par défaut ; il suffit d’activer le mode verbeux en faisant lilypond --verbose pour s’en rendre compte. Vous verrez ainsi défiler, en plus de nombreuses informations, le nom d’un certain nombre de fichiers et de chemins d’accès. Les fichiers les plus important sont mentionnés au chapitre (learning)Autres sources de documentation section ‘Autres sources de documentation’ dans Manuel d’initiation. Si vous venez à les modifier, rappelez-vous qu’ils seront écrasés à l’installation d’une nouvelle version de LilyPond.

Vous trouverez quelques exemples simples d’utilisation de la commande \include au chapitre (learning)Conducteurs et parties section ‘Conducteurs et parties’ dans Manuel d’initiation.

Voir aussi

Manuel d’initiation : (learning)Autres sources de documentation section ‘Autres sources de documentation’ dans Manuel d’initiation, (learning)Conducteurs et parties section ‘Conducteurs et parties’ dans Manuel d’initiation.

Problèmes connus et avertissements

Lorsque vous incluez un fichier qui porte le même nom que l’un des fichiers d’initialisation de LilyPond, le fichier de la distribution de LilyPond aura préséance.


[ < ] [ > ]   [ << ] [Plus haut] [ >> ]         [Racine] [Table des matières] [Index] [ ? ]

3.3.2 Différentes éditions à partir d’une même source

@translationof Different editions from one source

Plusieurs méthodes permettent de générer différentes versions d’une partition à partir d’une même source. Les variables – ou identificateurs – sont sûrement le moyen le plus simple de combiner de différentes manières des passages relativement longs, alors que les balises permettront de sélectionner de courts fragments selon leur utilisation.

Quelle que soit la méthode utilisée, séparer la notation de la structure de la partition vous donnera plus de liberté dans l’agencement de l’ouvrage final, puisque vous ne reviendrez pas sur la musique qui le compose.


[ < ] [ > ]   [ << ] [Plus haut] [ >> ]         [Racine] [Table des matières] [Index] [ ? ]

Utilisation de variables

@translationof Using variables

Un fragment musical identifié par une variable est réutilisable à divers endroits de la partition, comme nous l’avons vu à la rubrique (learning)Organisation du code source avec des variables section ‘Organisation du code source avec des variables’ dans Manuel d’initiation. Par exemple, une partition pour chœur a cappella comporte souvent une réduction pour piano reprenant toutes les voix ; il s’agit de la même musique, et vous ne devrez donc la saisir qu’une seule fois. D’autre part, la musique issue de deux variables peut se combiner sur une seule portée, comme nous l’avons vu à la rubrique Regroupement automatique de parties. Prenons l’exemple suivant :

 
sopranoMusic = \relative { a'4 b c b8( a) }
altoMusic = \relative { e'4 e e f }
tenorMusic = \relative { c'4 b e d8( c) }
bassMusic = \relative { a4 gis a d, }
allLyrics = \lyricmode { King of glo -- ry }
<<
  \new Staff = "Soprano" \sopranoMusic
  \new Lyrics \allLyrics
  \new Staff = "Alto" \altoMusic
  \new Lyrics \allLyrics
  \new Staff = "Tenor" {
    \clef "treble_8"
    \tenorMusic
  }
  \new Lyrics \allLyrics
  \new Staff = "Bass" {
    \clef "bass"
    \bassMusic
  }
  \new Lyrics \allLyrics
  \new PianoStaff <<
    \new Staff = "RH" {
      \set Staff.printPartCombineTexts = ##f
      \partCombine \sopranoMusic \altoMusic
    }
    \new Staff = "LH" {
      \set Staff.printPartCombineTexts = ##f
      \clef "bass"
      \partCombine \tenorMusic \bassMusic
    }
  >>
>>

[image of music]

Générer une partition chorale ou la réduction pour piano ne requiert que de modifier la structure des éléments, sans aucunement toucher à la musique.

Dans le cas d’une partition relativement longue, vous pouvez isoler la définition des différentes variables dans des fichiers séparés que vous rappellerez ensuite, comme indiqué à la rubrique Insertion de fichiers LilyPond.


[ < ] [ > ]   [ << ] [Plus haut] [ >> ]         [Racine] [Table des matières] [Index] [ ? ]

Utilisation de balises

@translationof Using tags

La commande \tag #'partieA affecte à une expression musicale le nom partieA. Les expressions ainsi balisées pourront être filtrées par la suite, à l’aide de \keepWithTag #'nom ou \removeWithTag #'nom. Ces filtres fonctionnent de la manière suivante :

FiltreRésultat
Musique balisée précédée de \keepWithTag #'nom ou \keepWithTag #'(nom1 nom2…)Musique non balisée et musique balisée par l’un des noms de balise fournis seront incluses ; la musique balisée autrement est exclue.
Musique balisée précédée de \removeWithTag #'nom ou \removeWithTag #'(nom1 nom2…)Musique non balisée et fragments appelés autrement que par l’un des noms fournis seront inclus ; la musique balisée par l’un des noms mentionnés est exclue.
Musique balisée non précédée de \keepWithTag ou \removeWithTagMusique balisée et non balisée seront incluses.

L’argument des commandes \tag, \keepWithTag et \removeWithTag doit être un symbole ou une liste de symboles (tel que #'conducteur ou #'(violonI violonII)), suivi d’une expression musicale. Si, et seulement si les symboles sont des indentifiants LilyPond valides (caractères alphabétiques uniquement, sans chiffre, souligné ou tiret) qui ne peuvent se confondre avec des notes, le #' peut s’omettre et, pour raccourcir, une liste de symbole peut utiliser le point en séparateur – autrement dit, \tag #'(violinI violinII) peut s’écrire \tag violinI.violinII. Ceci s’applique aussi bien pour \keepWithTag que pour \removeWithTag. Les commandes de balisage sont des fonctions musicales ; elles ne peuvent donc s’utiliser pour filtrer des éléments qui ne sont pas des expressions musicales tels que des blocs \book ou \score.

Dans l’exemple qui suit, nous obtenons deux versions du même extrait, l’une pour le conducteur, l’autre pour l’instrumentiste qui, elle, comportera les ornements développés.

 
music = \relative {
  g'8. c32 d
  \tag #'trills { d8.\trill }
  \tag #'expand { \repeat unfold 3 { e32 d } }
  c32 d
 }

\score {
  \keepWithTag #'trills \music
}
\score {
  \keepWithTag #'expand \music
}

[image of music]

Il est parfois plus aisé d’exclure des fragments :

 
music = \relative {
  g'8. c32 d
  \tag #'trills { d8.\trill }
  \tag #'expand {\repeat unfold 3 { e32 d } }
  c32 d
 }

\score {
  \removeWithTag #'expand
  \music
}
\score {
  \removeWithTag #'trills
  \music
}

[image of music]

Ce principe de filtrage peut s’appliquer aux articulations, textes, etc. Il suffit de positionner

 
-\tag #ma-balise

avant l’articulation ou le texte, comme ici :

 
c1-\tag #'doigt ^4
c1-\tag #'gaffe ^"Attention !"

Ceci définira une note avec une indication conditionnelle de doigté ou un texte.

Vous pouvez baliser différemment la même expression musicale en saisissant plusieurs \tag ou bien en combinant plusieurs balises dans une liste :

 
music = \relative c'' {
  \tag #'a \tag #'both { a4 a a a }
  \tag #'(b both) { b4 b b b }
}
<<
\keepWithTag #'a \music
\keepWithTag #'b \music
\keepWithTag #'both \music
>>

[image of music]

L’application concomitante de plusieurs filtres \removeWithTag à la même expression musicale permet d’exclure plusieurs balisages. Une liste fournie en argument à un unique \removeWithTag produira le même effet :

 
music = \relative c'' {
  \tag #'A { a4 a a a }
  \tag #'B { b4 b b b }
  \tag #'C { c4 c c c }
  \tag #'D { d4 d d d }
}
\new Voice {
  \removeWithTag #'B
  \removeWithTag #'C
  \music
  \removeWithTag #'(B C)
  \music
}

[image of music]

L’application de plus d’un filtre \keepWithTag à la même expression musicale aboutit à l’exclusion de tous les balisages. En effet, si le premier filtre exclut tous les autres balisages, l’application du second exclura les effets du premier. L’utilisation d’une unique commande \keepWithTag avec une liste de balises est en pareil cas des plus pertinente : seront exclus tous les fragments non concernés par l’une quelconque des balises mentionnées.

 
music = \relative c'' {
  \tag #'violinI { a4 a a a }
  \tag #'violinII { b4 b b b }
  \tag #'viola { c4 c c c }
  \tag #'cello { d4 d d d }
}

\new Staff {
  \keepWithTag #'(violinI violinII)
  \music
}

[image of music]

imprimera les \tags violinI et violinII, mais ni viola ni cello.

Bien que \keepWithTag soit efficace pour gérer un jeu d’alternatives, le rejet de musique filtrée par des balises étrangères se révèle problématique lorsque les \tag sont utilisés à plusieurs fins. Des « groupements de balises » peuvent alors être déclarés :

 
\tagGroup #'(violinI violinII viola cello)

Les différents filtres appartiennent désormais tous à un seul regroupement. Notez bien qu’une balise ne saurait être membre de plusieurs regroupements.

 
\keepWithTag #'violinI …

ne prendra désormais en compte que la musique concernée par la balise violinI du groupe de filtres : tout élément de la musique qui serait balisé par l’un des autres filtres de ce jeu sera rejeté.

 
music = \relative {
  \tagGroup #'(violinI violinII viola cello)
  \tag #'violinI { c''4^"violinI" c c c }
  \tag #'violinII { a2 a }
  \tag #'viola { e8 e e2. }
  \tag #'cello { d'2 d4 d }
  R1^"non balisé"
}

\new Voice {
  \keepWithTag #'violinI
  \music
}

[image of music]

Dans le cadre de la commande \keepWithTag, seules les balises du regroupement mentionnées dans la commande seront visibles.

Il peut arriver que vous ayez besoin de raccorder quelque chose en un point particulier d’une expression musicale. Les commandes \pushToTag et \appendToTag permettent d’insérer du matériau, qu’il soit antérieur ou postérieur, à des éléments d’une construction musicale existante. La musique séquentielle ou simultanée comporte assurément des éléments :

 
music = { \tag #'here { \tag #'here <<c''>> } }

{
  \pushToTag #'here c'
  \pushToTag #'here e'
  \pushToTag #'here g' \music
  \appendToTag #'here c'
  \appendToTag #'here e'
  \appendToTag #'here g' \music
}

[image of music]

Ces deux instructions sont affectées d’une balise, le matériau à raccorder à chaque instance de la balise, et l’expression balisée.

Voir aussi

Manuel d’initiation : (learning)Organisation du code source avec des variables section ‘Organisation du code source avec des variables’ dans Manuel d’initiation.

Manuel de notation : Insertion de fichiers LilyPond, Regroupement automatique de parties.

Problèmes connus et avertissements

L’application d’un \relative à une expression musicale obtenue par filtrage à l’aide de \keepWithTag ou \removeWithTag peut générer des changements d’octave, puisque seules les hauteurs récupérées dans ce filtre seront prises en considération. Une instruction \relative qui précède les commandes \keepWithTag ou \removeWithTag permet d’éviter ce risque, dans la mesure où elle viendra « recaler » ces hauteurs récupérées.


[ < ] [ > ]   [ << ] [Plus haut] [ >> ]         [Racine] [Table des matières] [Index] [ ? ]

Globalisation des réglages

@translationof Using global settings

Vous pouvez regrouper dans un fichier indépendant vos réglages personnels que vous inclurez au besoin :

 
lilypond -dinclude-settings=MES_REGLAGES.ly MA_PARTITION.ly

Vous pouvez ainsi stocker dans un fichier séparé vos réglages en matière de format de papier, de fontes utilisées ou vos définitions particulières. Selon le fichier de réglages que vous mentionnerez, vous obtiendrez facilement différentes éditions à partir d’une même source quelle qu’elle soit.

Cette technique peut s’utiliser en combinaison avec des feuilles de styles, comme indiqué au chapitre (learning)Feuilles de style section ‘Feuilles de style’ dans Manuel d’initiation.

Voir aussi

Manuel d’initiation : (learning)Feuilles de style section ‘Feuilles de style’ dans Manuel d’initiation, (learning)Organisation du code source avec des variables section ‘Organisation du code source avec des variables’ dans Manuel d’initiation.

Manuel de notation : Insertion de fichiers LilyPond.


[ < ] [ > ]   [ << ] [Plus haut] [ >> ]         [Racine] [Table des matières] [Index] [ ? ]

3.3.3 Caractères spéciaux

@translationof Special characters


[ < ] [ > ]   [ << ] [Plus haut] [ >> ]         [Racine] [Table des matières] [Index] [ ? ]

Codage du texte

@translationof Text encoding

LilyPond utilise le jeu de caractères défini par le consortium Unicode et la norme ISO/CEI 10646. Chaque caractère est identifié par un nom unique et associé à un point de code, ce qui permet dans l’absolu de couvrir tous les langages. Unicode permet de coder tous les caractères utilisés par toutes les langues écrites du monde. LilyPond utilise le codage UTF-8 (UTF pour Unicode Transformation Format) qui permet de représenter les caractères latins sur un octet et les autres sur une longueur allant jusqu’à quatre octets.

L’apparence réelle des caractères est déterminée par les glyphes ou graphèmes tels que définis dans les différentes polices disponibles. Une police, ou une fonte, définit la mise en correspondance d’un sous-ensemble de points de code unicode en glyphes. LilyPond recourt à la bibliothèque Pango pour assurer le rendu des textes multilingues.

LilyPond n’effectue aucune conversion d’encodage que ce soit. Ceci implique donc que tout texte – un titre, des paroles ou même une instruction musicale – comportant des caractères non ASCII soit codé en UTF-8. Le plus sûr moyen de saisir du texte de la sorte consiste à utiliser un éditeur supportant l’unicode et à enregistrer vos fichier en UTF-8. C’est le cas pour la plupart des éditeurs actuels, que ce soit vim, Emacs, jEdit et Gedit. Tous les systèmes Windows postérieurs à NT utilisent Unicode en natif ; même Notepad est capable d’éditer et sauvegarder un fichier en UTF-8 – sans parler de l’excellente alternative qu’est BabelPad.

La compilation d’un fichier LilyPond comportant des caractères non ASCII qui n’aurait pas été enregistré dans l’encodage UTF-8 vous renverra l’erreur

 
FT_Get_Glyph_Name () erreur : invalid argument

Voici un exemple utilisant du texte en cyrillique, en hébreux et en portugais.

[image of music]


[ < ] [ > ]   [ << ] [Plus haut] [ >> ]         [Racine] [Table des matières] [Index] [ ? ]

Unicode

@translationof Unicode

Lorsque vous avez besoin d’un caractère dont vous connaissez le point de code mais que votre éditeur ne permet pas de saisir directement, vous pouvez utiliser les instructions \char ##xhhhh ou \char #dddd au sein d’un bloc \markup – hhhh et dddd correspondant respectivement à la valeur hexadécimale ou décimale. Même s’il est inutile de saisir les zéros superflus, il est de bon ton de stipuler les quatre caractères formant la représentation hexadécimale. Évitez cependant l’encodage UTF-8 d’un point de code après un \char ; les encodages UTF-8 comprennent un bit supplémentaire indiquant le nombre d’octets. Une table de correspondance entre les codes Unicode et le nom des caractères ainsi que leur code hexadécimal est disponible sur le site du consortium Unicode, http://www.unicode.org/.

Par exemple, \char ##x03BE et \char #958 correspondent tous deux au caractère unicode U+03BE, dénommé « Greek Small Letter Xi ».

Quel que soit le point de code spécifié de cette manière, il ne vous sera alors pas nécessaire d’enregistrer votre fichier en UTF-8. Vous devrez toutefois disposer d’une fonte contenant ce caractère qui soit accessible à LilyPond.

L’exemple suivant illustre la manière d’insérer un caractère sous sa forme hexadécimale, à la fois dans un repère, dans une articulation, dans des paroles et dans du texte indépendant.

 
\score {
  \relative {
    c''1 \mark \markup { \char ##x03EE }
    c1_\markup { \tiny { \char ##x03B1 " to " \char ##x03C9 } }
  }
  \addlyrics { O \markup { \concat { Ph \char ##x0153 be! } } }
}
\markup { "Copyright 2008--2020" \char ##x00A9 }

[image of music]

Le signe copyright dans le champ de titrage consacré s’inscrit de la manière suivante :

 
\header {
  copyright = \markup { \char ##x00A9 "2008" }
}

[ < ] [ > ]   [ << ] [Plus haut] [ >> ]         [Racine] [Table des matières] [Index] [ ? ]

Équivalents ASCII

@translationof ASCII aliases

Dès lors que vous aurez inclus la liste de leur équivalent ASCII, LilyPond reconnaîtra un certain nombre de caractères spéciaux :

 
\paper {
  #(include-special-characters)
}

\markup "&flqq; &ndash; &OE;uvre incomplète&hellip; &frqq;"

\score {
  \new Staff { \repeat unfold 9 a'4 }
  \addlyrics {
    This is al -- so wor -- kin'~in ly -- rics: &ndash;_&OE;&hellip;
  }
}

\markup \column {
  "The replacement can be disabled:"
  "&ndash; &OE; &hellip;"
  \override #'(replacement-alist . ()) "&ndash; &OE; &hellip;"
}

[image of music]

L’extension de cette liste est possible aussi bien de manière globale :

 
\paper {
  #(add-text-replacements!
    '(("100" . "hundred")
      ("dpi" . "dots per inch")))
}
\markup "A 100 dpi."

[image of music]

qu’en un point particulier de votre source :

 
\markup \replace #'(("100" . "hundred")
                    ("dpi" . "dots per inch")) "A 100 dpi."

[image of music]

Voir aussi

Manuel de notation : Liste des caractères spéciaux.

Fichiers d’initialisation : ‘ly/text-replacements.ly’.


[ < ] [ > ]   [ << ] [Plus haut] [ >> ]

Ce document a été généré le le 13 juillet 2020 par gub en utilisant texi2html 1.82.

Autres langues : English, català, deutsch, español, italiano, 日本語.
À propos de la sélection automatique de la langue.