lilypond-user
[Top][All Lists]
Advanced

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

resetting accidentals at word breaks


From: Benjamin Bloomfield
Subject: resetting accidentals at word breaks
Date: Tue, 14 Apr 2020 12:14:42 -0400

Hi,

I am trying to get accidentals to be reset at every word break in a section of music without meter; I found some code to advance the internalBarNumber, in order to force the accidentals to be reset:
resetAccidentals = \applyContext
#(lambda (x)
  (begin
     (ly:context-set-property!
      (ly:context-property-where-defined x 'internalBarNumber)
      'internalBarNumber
      (1+ (ly:context-property x 'internalBarNumber)))
     ))

After this definition, putting in a \resetAccidentals in between words is working correctly causing the accidentals to get reset.  However, I wanted something more automatic, but I am not sure exactly how to go about it.  I remembered an engraver I had seen that collected lyric words by looking at lyric-hyphen-interface grobs and checking for LyricSpace ones, so I tried to write something to advance the internalBarNumber whenever a LyricSpace is encountered, but it isn't working reliably.

This is what I had:
resetAccidentalsAtNewWordsEngraver =
#(lambda (context)
   (let ((new-word #f)) ; signal to end word and begin another
     (make-engraver

      (acknowledgers
       ((lyric-hyphen-interface engraver grob source-engraver)
        (let* ((props (ly:grob-basic-properties grob))
               (meta (assoc-get 'meta props))
               (text-items (ly:grob-object grob 'text-items))
               (name (assoc-get 'name meta)))
          ; reset accidentals by incrementing bar number at every LyricSpace
          (if (eq? name 'LyricSpace) (ly:context-set-property!
                        (ly:context-property-where-defined context 'internalBarNumber)
                        'internalBarNumber
                        (1+ (ly:context-property context 'internalBarNumber)))))
              ))))

      )

However, I am still trying to figure out how engravers and contexts work to be able to know exactly what's going on.

Thanks for any help or ideas,

Benjamin Bloomfield

reply via email to

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