GNU LilyPond – Manuel de notation: 5.1.6 Définition de nouveaux contextes

### 5.1.6 Définition de nouveaux contextes

#### Généralités en matière de définition d’un contexte

Les contextes tels que `Staff` ou `Voice` sont faits de briques de construction empilées. En combinant divers graveurs, il est possible de créer de nouveaux types de contextes.

Dans l’exemple suivant on construit, de zéro, un nouveau contexte très semblable à `Voice`, mais qui n’imprime que des têtes de notes en forme de barre oblique au centre de la portée. Un tel contexte peut servir, par exemple, à indiquer un passage improvisé dans un morceau de jazz.

On a rassemblé les réglages dans un bloc `\context`, lui-même placé dans le bloc `\layout` :

>     \layout {
>       \context {
>         …
>       }
>     }

En lieu et place des points (…), voici les éléments à saisir :

Tout d’abord, il convient de donner un nom à notre nouveau contexte :

>     \name ImproVoice

Comme il est très semblable à un contexte `Voice`, nous souhaitons que toutes les commandes associées au `Voice` déjà existant restent valables. D’où nécessité de la commande `\alias`, qui va l’associer au contexte `Voice` :

>     \alias Voice

Ce contexte doit pouvoir imprimer des notes et des indications textuelles ; on ajoute donc les graveurs appropriés ainsi que celui dévolu au regroupement sous forme de colonne des notes, hampes et silences qui interviennent au même moment musical :

>     \consists Note_heads_engraver
>     \consists Text_engraver
>     \consists Rhythmic_column_engraver

Toutes les notes devraient s’afficher au centre de la portée :

>     \consists Pitch_squash_engraver
>     squashedPosition = #0

Le graveur `Pitch_squash_engraver` intercepte les notes créées par le `Note_heads_engraver`, et les « écrase » pour qu’elles aient toutes la même position verticale, définie par `squashedPosition` : ici il s’agit de la valeur `0`, c’est-à-dire la ligne du milieu.

On veut que les notes aient la forme d’une barre oblique, sans aucune hampe :

>     \override NoteHead.style = #'slash
>     \hide Stem

Tous ces modules doivent communiquer sous le contrôle du contexte. Les mécanismes permettant aux contextes de communiquer sont établis dès lors que le mot-clé `\type` précède le contexte. La plupart des contextes mentionnés au sein d’un bloc `\layout` seront de type `Engraver_group`. Certains contextes spécifiques reposent sur d’autres types de contexte. Recopier un contexte préexistant pour en modifier la définition lui affecte le type adéquat. Dans la mesure où notre exemple consiste à créer une définition de toute pièce, son type doit être explicitement spécifié.

>     \type Engraver_group

Récapitulons ; on se retrouve avec le bloc suivant :

>     \context {
>       \name ImproVoice
>       \type Engraver_group
>       \consists Note_heads_engraver
>       \consists Text_engraver
>       \consists Rhythmic_column_engraver
>       \consists Pitch_squash_engraver
>       squashedPosition = #0
>       \override NoteHead.style = #'slash
>       \hide Stem
>       \alias Voice
>     }

Ce n’est pas tout. En effet, on veut intégrer le nouveau contexte `ImproVoice` dans la hiérarchie des contextes. Tout comme le contexte `Voice`, sa place est au sein du contexte `Staff`. Nous allons donc modifier la définition du contexte `Staff`, au moyen de la commande `\accepts` :

>     \context {
>       \Staff
>       \accepts ImproVoice
>     }

Souvent, lorsque l’on réutilise le définition d’un contexte, le contexte qui en résultera devrait pouvoir s’utiliser partout où le contexte originel serait utile.

>     \layout {
>       …
>       \inherit-acceptability résultant originel
>     }

fera en sorte que les contextes de type résultant soient acceptés par le contextes qui acceptent originel. Par exemple, libeller

>     \layout {
>       …
>       \inherit-acceptability ImproVoice Voice
>     }

aura pour effet d’ajouter un `\accepts` pour `ImproVoice` à la fois aux définitions de `Staff` et `RhythmicStaff`.

Le contraire de `\accepts` est `\denies` ; il est parfois utile lorsque l’on recycle des définitions de contextes déjà existantes.

Enfin, tout cela doit prendre place dans le bloc `\layout`, comme ceci :

>     \layout {
>       \context {
>         \name ImproVoice
>         …
>       }
>       \context {
>         \Staff
>         \accepts ImproVoice
>       }
>     }

On peut alors saisir la musique, comme dans l’exemple plus haut :

>     \relative {
>       a'4 d8 bes8
>       \new ImproVoice {
>         c4^"ad lib" c
>         c4 c^"dévêtez-vous"
>         c c_"tout en jouant :)"
>       }
>       a1
>     }

#### Voir aussi

Référence des propriétés internes : Contextes, Graveurs et exécutants.

#### Création de contextes en MIDI

En matière de sortie MIDI, la syntaxe permettant de définir de nouveaux types de contextes est identique, à ceci près que la section `\context` viendra se placer au sein du bloc `\midi` et le `\type` sera `Performer_group` au lieu de `Engraver_group`. Le terme engraver (graveur) fait référence à un module de contexte chargé de générer une sotie visuelle, alors qu’un performer (exécutant) est dévolu exclusivement à une sortie MIDI. Lorsque les noms de modules comportent translator (traducteur) au lieu de engraver ou performer, ils sont alors fonctionnels tant pour des sorties graphiques qu’audio. Afin d’adapter une définition de contexte pour le bloc `\midi`, il faudra

- la copier dans un bloc `\midi`,
- changer `Engraver_group` en `Performer_group`,
- supprimer les `\consists` propres aus graveurs (ils ne sont pas pertinents) et éventuellement ajouter des `\consists` pour les exécutants.

Il faut garder à l’esprit, afin de préserver une cohérence d’interprétation entre les sorties imprimables et MIDI, qu’il est de bon ton de reporter toute définition de contexte personnalisée dans le bloc `\midi`. Cette duplication devrait au moins comporter les commandes spécifiant la hiérarchie du contexte, telles que `\accepts`, `\defaultchild` et `\inherit-acceptability`. Recopier aussi les alias est recommandé.

Ainsi, dans le but de compléter l’exemple vu plus haut, on peut y ajouter :

>     \midi {
>       \context {
>         \name ImproVoice
>         \type Performer_group
>         \alias Voice
>         \consists Note_performer
>         \consists Beam_performer
>         \consists Dynamic_performer
>         \consists Tie_performer
>         \consists Slur_performer
>       }
>       \context {
>         \Staff
>         \accepts ImproVoice
>       }
>     }

Le contexte `ImproVoice` sera alors fonctionnel pour la sortie MIDI.

#### Remplacement du contexte `Score`

Dans le but d’écrire un contexte `MonScore` qui agirait comme étant le contexte le plus haut, à l’instar de ce que fait le contexte `Score`, il faudra expliciter une instruction `\inherit-acceptability MonScore Score`. L’exemple suivant définit un contexte `ProportionalScore` pour lequel la notation proportionnelle est activée (cf. Notation proportionnelle).

>     \layout {
>       \context {
>         \Score
>         \name ProportionalScore
>         \alias Score
>         proportionalNotationDuration = #(ly:make-moment 1/4)
>       }
>       \inherit-acceptability ProportionalScore Score
>     }

>     \new ProportionalScore { c'1 2 4 8 16 32 64 64 }

Dans la mesure où le contexte sommital doit contenir certains graveurs fondamentaux, hériter des réglages de `\Score` est facile dans la plupart des cas. Néanmoins, la définition d’un contexte de niveau `Score` à partir de zéro requiert que l’argument à `\type` soit égal à `Score_engraver` (ou `Score_performer` dans le bloc `\midi`) en lieu et place de `Engraver_group`. Par ailleurs, affecter au contexte sommital l’alias `Score` est fortement recommandé dans la mesure où un certin nombre de graveurs ont besoin d’accéder au contexte sommital par son alias.

#### LilyPond — Manuel de notation v2.24.4 (branche stable).