lilypond-user
[Top][All Lists]
Advanced

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

Re: (Urgent:) Getting start and end translation-timestep of a (hairpin)


From: David Nalesnik
Subject: Re: (Urgent:) Getting start and end translation-timestep of a (hairpin) grob
Date: Sat, 11 Apr 2015 09:01:55 -0500

Hi Urs,

On Sat, Apr 11, 2015 at 3:31 AM, Urs Liska <address@hidden> wrote:
Hi,

this is related to my previous thread and particularly to the file attached to
http://lists.gnu.org/archive/html/lilypond-user/2015-04/msg00263.html

If I have a Scheme engraver listening to TextScript-s I can get a list of entries at the same timestep and then compare them for equality.
This even works without changes for DynamicText because that also has a 'text property. But if i have spanners such as hairpins it's not that simple anymore. So I'm asking myself if I can access the starting and ending timesteps of hairpins that are present in such a list. Of course I can collect hairpins in a list like I can collect TextScripts (currently I'm listening for line-interface). But is it possible to retrieve the start *and* end position of such items?

The goal is to iterate over the list and find matching hairpins to remove duplicate ones.


A simple way to determine when a hairpin starts and ends is by using an acknowledger and an end-acknowledger:

 myEngraver =
#(lambda (context)
     (make-engraver
      
      (acknowledgers
       ((hairpin-interface engraver grob source-engraver)
        (format #t "My start is at ~a~%" (ly:context-current-moment context))))
      
      (end-acknowledgers
       ((hairpin-interface engraver grob source-engraver)
        (format #t "My end is at ~a~%" (ly:context-current-moment context))))
     ))

\layout {
  \context {
    \Score
    \consists \myEngraver
  }
}

{
  c''1~\<
  c''1\!
  c''2.\< c''4\!
  c''1~\>
  \break
  c''2~ c''\!
}


If you're collecting the hairpins for processing later, you could find the timings of beginnings and endings through the columns at their bounds:

myEngraver =
#(lambda (context)
   (let ((hairpins '()))
     (make-engraver
      (acknowledgers
       ((hairpin-interface engraver grob source-engraver)
        (set! hairpins (cons grob hairpins))))
      
      ((finalize trans)
       (for-each
        (lambda (hp)
          (format #t "BEGINNING ~a END: ~a~%"
            (grob::when (ly:item-get-column (ly:spanner-bound hp LEFT)))
            (grob::when (ly:item-get-column (ly:spanner-bound hp RIGHT)))))
        hairpins))
      )))

\layout {
  \context {
    \Score
    \consists \myEngraver
  }
}

{
  c''1~\<
  c''1\!
  c''2.\< c''4\!
  c''1~\>
  \break
  c''2~ c''\!
}

(Unfortunately, the above method won't work within stop-translation-timestep as in the code you cite because the hairpin bounds haven't been assigned column yet, it seems.)

Alternatively, couldn't you just compare bounds?  If a hairpin has the same left and right bound as another, that hairpin is a duplicate?  I would think this would be the easiest method to incorporate into your code.

HTH,
David

reply via email to

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