[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: custom engraver in scheme: accessing nested Music object
From: |
Reinhold Kainhofer |
Subject: |
Re: custom engraver in scheme: accessing nested Music object |
Date: |
Wed, 10 Aug 2011 17:38:21 +0200 |
User-agent: |
KMail/1.13.6 (Linux/2.6.38-11-generic; KDE/4.7.0; i686; ; ) |
Am Mittwoch, 10. August 2011, 17:11:44 schrieb Ricardo Wurmus:
> On Aug 10, Neil Puttock wrote:
> > BTW, if you're prepared to wrap the notes in a chord (so you have
> > access to 'articulations), you won't even need a scheme engraver (all
> > the processing can take place in the NoteHead's stencil callback).
>
> It should be a generic engraver, so I cannot assume that notes will
> always be wrapped in a chord. I'll play around with defining a function
> for process-acknowledged and see where it leads me.
One detail that might be interesting for you is that you can define engraver-
wide variables by wrapping the whole engraver in a (let (..) ...) block.
See e.g. the scheme engraver instance regtest (input/regression/scheme-
engraver-instance.ly in the source code tree):
\header {
texidoc = "Scheme engravers may be instantiated, with
instance-scoped slots, by defining a 1 argument procedure which
shall return the engraver definition as an alist, with the private
slots defined in a closure. The argument procedure argument is the
context where the engraver is instantiated."
}
\version "2.14.0"
\layout {
\context {
\Voice
\consists
#(let ((instance-counter 0))
(lambda (context)
(set! instance-counter (1+ instance-counter))
(let ((instance-id instance-counter)
(private-note-counter 0))
`((listeners
(note-event
. ,(lambda (engraver event)
(set! private-note-counter (1+ private-note-counter))
(let ((text (ly:engraver-make-grob engraver 'TextScript
event)))
(ly:grob-set-property! text 'text
(format #f "~a.~a" instance-id
private-note-
counter))))))))))
}
}
<<
\relative c'' { c4 d e f }
\\ \relative c' { c4 d e f }
>>
In this example, instance-counter is a global variable, which is reused by
every voice, while instance-id and private-note-counter are variables that are
separate for each voice. In this example, instance-id stores the number of the
voice, while private-note-counter counts the number of notes in each voice
separately.
In particular, the engravers used in the first and in the second voice will
have different private-note-counter variables.
You can use this to collect information from all encountered objects and thin
in 'process-acknowledged or 'stop-translation-timestep procell all of them at
once. For a list of all possible "functions" inside the engraver, see
input/regression/scheme-engraver.ly
Cheers,
Reinhold
--
------------------------------------------------------------------
Reinhold Kainhofer, address@hidden, http://reinhold.kainhofer.com/
* Financial & Actuarial Math., Vienna Univ. of Technology, Austria
* http://www.fam.tuwien.ac.at/, DVR: 0005886
* LilyPond, Music typesetting, http://www.lilypond.org
- custom engraver in scheme: accessing nested Music object, Ricardo Wurmus, 2011/08/10
- Re: custom engraver in scheme: accessing nested Music object, Reinhold Kainhofer, 2011/08/10
- Re: custom engraver in scheme: accessing nested Music object, Ricardo Wurmus, 2011/08/10
- Re: custom engraver in scheme: accessing nested Music object, Reinhold Kainhofer, 2011/08/10
- Re: custom engraver in scheme: accessing nested Music object, Ricardo Wurmus, 2011/08/10
- Re: custom engraver in scheme: accessing nested Music object, Neil Puttock, 2011/08/10
- Re: custom engraver in scheme: accessing nested Music object, Ricardo Wurmus, 2011/08/10
- Re: custom engraver in scheme: accessing nested Music object,
Reinhold Kainhofer <=
- Re: custom engraver in scheme: accessing nested Music object, Ricardo Wurmus, 2011/08/11