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.

[image of music]

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

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 }

[image of music]

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.23.82 (branche de développement).