lilypond-user
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: macro for \once\override


From: Aaron Hill
Subject: Re: macro for \once\override
Date: Sat, 29 Aug 2020 05:32:11 -0700
User-agent: Roundcube Webmail/1.4.2

On 2020-08-29 3:19 am, Wols Lists wrote:
On 29/08/20 05:45, Werner LEMBERG wrote:
      \once \override FretBoard.size = #'1.0
\once \override FretBoard.fret-diagram-details.barre-type = #'straight \once \override FretBoard.fret-diagram-details.dot-color = #'black \once \override FretBoard.fret-diagram-details.finger-code = #'below-string
      c'

Unfortunately this might well require re-writing the parser, but it
struck me it might be a nice idea to nick an idea from other object
oriented languages as follows ...

    \once \override FretBoard.size = #'1.0
    \once \override \using FretBoard.fret-diagram-details {
        .barre-type = #'straight
        .dot-color = #'black
        .finger-code = #'below-string
    }
    c'

No need to rewrite anything. We can use \with to assist with this pattern:

%%%%
overrideII =
#(define-music-function
  (prop mods)
  (key-list? ly:context-mod?)
  (define (assign? mod) (eq? 'assign (car mod)))
  (define (proc mod)
    (let ((subprop (cadr mod))
          (value (caddr mod)))
      #{ \override #prop . #subprop = #value #}))
  #{ #@(map proc (filter assign? (ly:get-context-mods mods))) #})
%%%%

While there is almost certainly a better name than overrideII, it permits the following:

%%%%
\once \override FretBoard.fret-diagram-details.barre-type = #'none
\once \override FretBoard.fret-diagram-details.number-type = #'arabic
\once \override FretBoard.fret-diagram-details.orientation = #'landscape
\once \override FretBoard.fret-diagram-details.mute-string = #"M"
\once \override FretBoard.fret-diagram-details.label-dir = #LEFT
\once \override FretBoard.fret-diagram-details.dot-color = #'black
%% ...becomes...
\once \overrideII FretBoard.fret-diagram-details
\with {
  barre-type = #'none
  number-type = #'arabic
  orientation = #'landscape
  mute-string = #"M"
  label-dir = #LEFT
  dot-color = #'black
}
%%%%

-- Aaron Hill



reply via email to

[Prev in Thread] Current Thread [Next in Thread]