[Top][All Lists]

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

custom engraver in scheme: accessing nested Music object

From: Ricardo Wurmus
Subject: custom engraver in scheme: accessing nested Music object
Date: Wed, 10 Aug 2011 15:44:00 +0800
User-agent: Mutt/1.5.21 (2010-09-15)


I'm currently attempting to write a custom engraver in scheme.
This is the shortened code:

    ;; global variables to be used in `do-something'
    #(define g_filled #f)
    #(define g_direction 0)
    #(define g_finger 0)
    #(define g_string-number 0)
    ;; ....

    #(define-public (music-cause grob)
          ((event (event-cause grob)))

        (if (ly:stream-event? event)
            (ly:event-property event 'music-cause)

    #(define my-engraver

         (cons 'acknowledgers
             (cons 'note-head-interface
               (lambda (engraver grob source-engraver)
                 (let* ((event (event-cause grob))
                        (mus (music-cause grob))

                        ;; TODO: how do I get *into* this articulations list?
                        (articulations (ly:music-property mus 'articulations)))

                   ;; note head filling depends on duration
                   (set! g_filled (ly:moment<? duration filled-threshold))
                   (do-something grob))))))

The `do-something' function (not shown here) replaces note heads according to
variables that I hope to extract from the event data structure.

In my code, the `mus' variable contains the music object, which has a property
`articulations'. This is what the music object looks like when displaying it:

    #<Prob: Music C++: Music(
      (length . #<Mom 1/4>)
      (duration . #<Duration 4 >)
      (articulations #<Prob: Stream_event C++: Stream_event
                     ((music-cause . #<Prob: Music C++: Music
                                   ((digit . 2)
                                    (origin . #<location>))
                                   ((display-methods #<procedure #f (event 
                                    (name . FingeringEvent)
                                    (types general-music fingering-event 
event)) >)
                      (digit . 2)
                      (origin . #<location>))
                     ((class . fingering-event)) >
      (pitch . #<Pitch bes >)
      (origin . #<location>))

    ((display-methods #<procedure #f (note parser)>)
     (name . NoteEvent)
     (types general-music event note-event rhythmic-event melodic-event)) >

I'm trying to get to the music object *inside* the `articulations' list,
but I cannot seem to find a way to do so. Simply getting the property
`articulations' with ly:music-property returns a list, but I cannot run
cdr or car on that list to get to the Stream_event.

Is there a way to do this? Maybe this is the wrong approach. Is there
another way to get access to all music properties from within an
Can I use more than one interface in the same acknowledger?

I tried using event listeners before to collect the note properties, but
this fails as soon as there is more than one voice, because the
acknowledgers are called after *all* the listeners at a certain moment.

I'd appreciate any comments or hints.



reply via email to

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