33.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 sont 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. Écrire
\layout {
…
\inherit-acceptability résultant originel
}
fait 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
}
a 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_groupenPerformer_group, - supprimer les
\consistspropres aus graveurs (ils ne sont pas pertinents) et éventuellement ajouter des\consistspour 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 = #1/8 } \inherit-acceptability ProportionalScore Score } music = { c'1 2 4 8 16 16 } \new Score \music \new ProportionalScore \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.
![[image of music]](../55/lily-7d072a32.png)
![[image of music]](../a3/lily-3fa7da09.png)