Am So., 19. Mai 2024 um 21:28 Uhr schrieb Carolyn Beeton
<[email protected]>:
>
> I would like to include some Staff and Voice context settings in the \midi
> block only if a flag is set to ##t and I have not been able to figure out how
> to do this. When I try to wrap the \context blocks in a code block with
> #{…#} I get this error:
> trackPerVoiceMWE.ly:31:16: error: syntax error, unexpected '{', expecting
> SCM_IDENTIFIER or SCM_TOKEN or STRING or SYMBOL
> \context {
> Is there any way to conditionally change the Staff_performer based on a flag
> setting?
>
> This is my non-working MWE:
>
> \version "2.24.0"
> \include "english.ly"
>
> global = {
> \key c \major
> \time 4/4
> }
> TrackPerVoice = ##t
> \score {
> \new ChoirStaff <<
> \new Staff <<
> \new Voice = "soprano" <<
> \global
> \relative c' { c'4 d e f << g1 \\ { g4 f e2 } >> }
> >>
> \new Voice = "alto" <<
> \global
> \voiceTwo
> \relative c' { c'4 b a g | f e d2 }
> >>
> >>
> >>
> \layout {}
> \midi {
> #(display (format #f "TrackPerVoice is ~a\n" TrackPerVoice))
> #(if TrackPerVoice #{
> #(display "One track per Voice (may make too many voices with
> polyphony)")
> #(display "Turn this off to get sop and alto combined in one track.")
> \context {
> \Staff
> \remove "Staff_performer"
> }
> \context {
> \Voice
> \consists "Staff_performer"
> }
> #} )
> }
> }
>
> Thanks,
> Carolyn
Here my take on this. Modeled after `enablePolymeter`. Prpbably
overkill, though...
\version "2.24.3"
enableVoicePerformer =
#(define-void-function (do-it) (boolean?)
(when do-it
(display "One track per Voice (may make too many voices with polyphony)")
(display "Turn this off to get sop and alto combined in one track.")
(let ((module (current-module))
(cmod-remove (ly:make-context-mod))
(cmod-consists (ly:make-context-mod)))
(if (not (output-module? module))
(ly:parser-error (G_ "Not in an output definition")))
(ly:add-context-mod cmod-remove (list 'remove 'Staff_performer))
(ly:add-context-mod cmod-consists (list 'consists 'Staff_performer))
;; FIXME: any chance to use ly:output-find-context-def here? The
;; problem is that we don't have access to the context def, just
;; its scope (module).
(module-map
(lambda (_sym var)
(if (variable-bound? var)
(let ((cdef (variable-ref var)))
(if (ly:context-def? cdef)
(let* ((context-name
(ly:context-def-lookup cdef 'context-name))
(aliases (ly:context-def-lookup cdef 'aliases))
(all-names (cons context-name aliases)))
(cond
((memq 'Staff all-names)
(variable-set!
var
(ly:context-def-modify cdef cmod-remove)))
((memq 'Voice all-names)
(variable-set!
var
(ly:context-def-modify cdef cmod-consists)))))))))
module))))
global = {
\key c \major
\time 4/4
}
TrackPerVoice = ##t
\score {
\new ChoirStaff <<
\new Staff
\with { midiInstrument = "acoustic grand" }
<<
\new Voice = "soprano"
\with { midiInstrument = "marimba" }
<<
\global
\relative c' { c'4 d e f << g1 \\ { g4 f e2 } >> }
>>
\new Voice = "alto"
\with { midiInstrument = "violin" }
<<
\global
\voiceTwo
\relative c' { c'4 b a g | f e d2 }
>>
>>
>>
\layout {}
\midi {
\enableVoicePerformer \TrackPerVoice
}
}
Cheers,
Harm