Hello Werner, properties handle this by having internally not a single value, but a list of values, and temporary overriding simply means adding to that list. Context properties do currently not allow for this mechanic, but we could simulate it ourselves:
#(set-object-property! 'details
'translation-type?
list?)
tset =
#(define-music-function (path value)
(key-list? scheme?)
(if (= (length path) 1) (set! path (cons 'Voice path)))
(context-spec-music
(make-music 'ApplyContext
'procedure
(lambda (ctx)
(let* ((details (ly:context-property ctx 'details))
(this-hierarchy (assoc-get (cadr path) details '()))
(this-val (ly:context-property ctx (cadr path))))
(ly:context-set-property! ctx
'details
(assoc-set!
details
(cadr path)
(cons this-val this-hierarchy)))
(ly:context-set-property! ctx (cadr path) value))))
(car path)))
rset =
#(define-music-function (path)
(key-list?)
(if (= (length path) 1) (set! path (cons 'Voice path)))
(context-spec-music
(make-music 'ApplyContext
'procedure
(lambda (ctx)
(let* ((details (ly:context-property ctx 'details))
(this-hierarchy (assoc-get (cadr path) details '())))
(if (null? this-hierarchy)
(ly:context-unset-property ctx (cadr path))
(begin
(ly:context-set-property! ctx (cadr path) (car
this-hierarchy))
(ly:context-set-property! ctx
'details
(assoc-set!
details
(cadr path)
(cdr this-hierarchy))))))))
(car path)))
{
\set Staff.middleCPosition = 0
c1
\set Staff.middleCPosition = 1
c1
\unset Staff.middleCPosition
c1
\break
\tset Staff.middleCPosition 0
c1
\tset Staff.middleCPosition 1
c1
\rset Staff.middleCPosition
c1
\rset Staff.middleCPosition
c1
}
Cheers,
Valentin
Am Montag, 25. März 2024, 08:31:34 CET schrieb Werner LEMBERG:
> LilyPond provides `\temporary` and `\revert` to set a grob property
> temporarily, and afterwards the value of the grob property is the same
> as before.
>
> Is there a similar possiblity for `\set` (or something usable in
> Scheme)? I guess not, but I couldn't find this documented
> somewhere...
>
>
> Werner
signature.asc
Description: This is a digitally signed message part.
