| [ < ] | [ > ] | [ << ] | [Plus haut] | [ >> ] | [Racine] | [Table des matières] | [Index] | [ ? ] |
@translationof Contexts for programmers
| 2.6.1 Évaluation d’un contexte | ||
| 2.6.2 Application d’une fonction à tous les objets de mise en forme |
| [ < ] | [ > ] | [ << ] | [Plus haut] | [ >> ] | [Racine] | [Table des matières] | [Index] | [ ? ] |
@translationof Context evaluation
Un contexte peut être modifié, au moment même de son interprétation, par du code Scheme. La syntaxe consacrée au sein d’un bloc LilyPond est
\applyContext fonction |
et, dans le cadre d’un code Scheme :
(make-apply-context fonction) |
fonction est constitué d’une fonction Scheme comportant un
unique argument : le contexte au sein duquel la commande
\applyContext est appelée. Cette fonction peut accéder aussi
bien aux propriétés de grob (y compris modifiées par
\override ou \set) qu’aux propriétés de contexte. Toute
action entreprise par la fonction et qui dépendrait de l’état du
contexte sera limitée à l’état de ce contexte au moment de l’appel à
la fonction. Par ailleurs, les adaptations résultant d’un appel à
\applyContext seront effectives jusqu’à ce qu’elles soient à
nouveau directement modifiées ou bien annulées, quand bien même les
conditions initiales dont elles dépendent auraient changé.
Voici quelques fonctions Scheme utiles avec \applyContext :
ly:context-propertyrecherche la valeur d’une propriété de contexte,
ly:context-set-property!détermine une propriété de contexte,
ly:context-grob-definitionly:assoc-getrecherche la valeur d’une propriété de grob,
ly:context-pushpop-propertyréalise un \temporary \override ou un \revert sur une
propriété de grob.
L’exemple suivant recherche la valeur en cours de fontSize puis
la double :
doubleFontSize = \applyContext #(lambda (context) (let ((fontSize (ly:context-property context 'fontSize))) (ly:context-set-property! context 'fontSize (+ fontSize 6)))) { \set fontSize = -3 b'4 \doubleFontSize b' }
L’exemple suivant recherche la couleur des objets NoteHead,
Stem et Beam, puis diminue pour chacun d’eux le degré de
saturation.
desaturate = \applyContext #(lambda (context) (define (desaturate-grob grob) (let* ((grob-def (ly:context-grob-definition context grob)) (color (ly:assoc-get 'color grob-def black)) (new-color (map (lambda (x) (min 1 (/ (1+ x) 2))) color))) (ly:context-pushpop-property context grob 'color new-color))) (for-each desaturate-grob '(NoteHead Stem Beam))) \relative { \time 3/4 g'8[ g] \desaturate g[ g] \desaturate g[ g] \override NoteHead.color = #darkred \override Stem.color = #darkred \override Beam.color = #darkred g[ g] \desaturate g[ g] \desaturate g[ g] }
Ceci pourrait tout à fait s’implémenter sous la forme d’une fonction
musicale, afin d’en réduire les effets à un seul bloc de musique. Notez
comment ly:context-pushpop-property est utilisé à la fois pour un
\temporary \override et pour un \revert :
desaturate = #(define-music-function (music) (ly:music?) #{ \applyContext #(lambda (context) (define (desaturate-grob grob) (let* ((grob-def (ly:context-grob-definition context grob)) (color (ly:assoc-get 'color grob-def black)) (new-color (map (lambda (x) (min 1 (/ (1+ x) 2))) color))) (ly:context-pushpop-property context grob 'color new-color))) (for-each desaturate-grob '(NoteHead Stem Beam))) #music \applyContext #(lambda (context) (define (revert-color grob) (ly:context-pushpop-property context grob 'color)) (for-each revert-color '(NoteHead Stem Beam))) #}) \relative { \override NoteHead.color = #darkblue \override Stem.color = #darkblue \override Beam.color = #darkblue g'8 a b c \desaturate { d c b a } g b d b g2 }
| [ < ] | [ > ] | [ << ] | [Plus haut] | [ >> ] | [Racine] | [Table des matières] | [Index] | [ ? ] |
@translationof Running a function on all layout objects
La manière la plus souple d’affiner un objet consiste à utiliser la
commande \applyOutput. Celle-ci va insérer un événement
(
(internals)ApplyOutputEvent section ‘ApplyOutputEvent’ dans Référence des propriétés internes) dans le contexte spécifié. Elle répond
aussi bien à la syntaxe
\applyOutput Contexte procédure |
que
\applyOutput Contexte.Grob procédure |
où procédure est une fonction Scheme à trois arguments.
Lors de l’interprétation de cette commande, la fonction
procédure est appelée pout tout objet de rendu (nommé
Grob si celui-ci est spécifié) appartenant au contexte
Contexte à cet instant précis, avec les arguments
suivants :
\applyOutput est effectué.
De plus, ce qui est à l’origine de l’objet de rendu – l’expression
musicale ou l’objet qui l’a générée – se retrouve en tant que propriété
d’objet cause. Il s’agit, pour une tête de note, d’un événement
(internals)NoteHead section ‘NoteHead’ dans Référence des propriétés internes, et d’un objet
(internals)Stem section ‘Stem’ dans Référence des propriétés internes pour une hampe.
Voici une fonction utilisable avec la commande
\applyOutput : elle « blanchit » la tête des notes se trouvant
sur la ligne médiane ou bien directement à son contact.
#(define (blanker grob grob-origin context) (if (< (abs (ly:grob-property grob 'staff-position)) 2) (set! (ly:grob-property grob 'transparent) #t))) \relative { a'4 e8 <<\applyOutput Voice.NoteHead #blanker a c d>> b2 }
La procédure sera interprétée au niveau Score (partition)
ou Staff (portée) dès lors que vous utiliserez l’une des syntaxes
\applyOutput Score… \applyOutput Staff… |
| [ < ] | [ > ] | [ << ] | [Plus haut] | [ >> ] |
Ce document a été généré le le 13 juillet 2020 par gub en utilisant texi2html 1.82.
Autres langues : English, deutsch, español.
À propos de la sélection automatique de la langue.