Am Di., 14. Juli 2020 um 18:47 Uhr schrieb Carl Sorensen <carl.d.soren...@gmail.com>: > > Ernie, > > I'll point it out below. > > On Tue, Jul 14, 2020 at 10:42 AM Ernie Braganza <ernie.braga...@gmail.com> > wrote: >> >> I am not sure where to place this new engraver code so I can use it. I tried >> researching this in the manual, but was still unclear. Where should it >> appear? Again, thanks for your help >> >> On Mon, Jul 13, 2020 at 8:15 PM Thomas Morley <thomasmorle...@gmail.com> >> wrote: >>> >>> >>> Here an engraver which transforms the default stencil to an empty >>> stencil under certain conditions (it's not a rewrite of >>> Chord_name_engraver) >>> > Right here is a new ChordNames context that has everything you need. Put the > whole context into your file, replacing the current ChordNames context. >>> >>> \new ChordNames >>> \with { >>> chordChanges = ##t >>> \consists >>> #(lambda (ctx) >>> (let* ((chord #f) >>> (last-chord #f)) >>> >>> (define (at-line-beginning? grob) >>> (let* ((col (ly:item-get-column grob)) >>> (ln (ly:grob-object col 'left-neighbor)) >>> (col-to-check (if (ly:grob? ln) ln col))) >>> (and (eq? #t (ly:grob-property col-to-check 'non-musical)) >>> (= 1 (ly:item-break-dir col-to-check))))) >>> >>> (make-engraver >>> (acknowledgers >>> ((chord-name-interface this-engraver grob source-engraver) >>> >>> (if chord >>> (begin >>> (set! last-chord chord) >>> (set! chord #f))) >>> >>> (set! chord (ly:grob-property grob 'text)) >>> >>> ;; If two subsequent chords are equal and chordChanges is >>> enabled, >>> ;; set 'after-line-breaking to a procedure which sets the >>> stencil >>> ;; to an empty-stencil if the new chord is at line-start. >>> (if (and (equal? chord last-chord) >>> (ly:context-property ctx 'chordChanges #f)) >>> (ly:grob-set-property! grob 'after-line-breaking >>> (lambda (grob) >>> (if (at-line-beginning? grob) >>> (ly:grob-set-property! grob 'stencil >>> empty-stencil)) >>> ;; keep default >>> (ly:chord-name::after-line-breaking grob)))))) >>> ((finalize this-engraver) >>> ;; house keeping >>> (set! chord #f) >>> (set! last-chord #f))))) >>> } > > This is the end of the ChordNames context > >>> >>> \chordmode { d2 c~ \break c d } >>> > The chormode code is then placed in the ChordNames context. You may wish to > surround it with{}, although it is not necessary here because the \chordmode > {} is a single music expresion. > > HTH, > > Carl
Addditionally, it may be less confusing if you name the engraver. Makes for: My_chord_changes_engraver = #(lambda (ctx) (let* ((chord #f) (last-chord #f)) (define (at-line-beginning? grob) (let* ((col (ly:item-get-column grob)) (ln (ly:grob-object col 'left-neighbor)) (col-to-check (if (ly:grob? ln) ln col))) (and (eq? #t (ly:grob-property col-to-check 'non-musical)) (= 1 (ly:item-break-dir col-to-check))))) (make-engraver (acknowledgers ((chord-name-interface this-engraver grob source-engraver) (if chord (begin (set! last-chord chord) (set! chord #f))) (set! chord (ly:grob-property grob 'text)) ;; If two subsequent chords are equal and chordChanges is enabled, ;; set 'after-line-breaking to a procedure which sets the stencil ;; to an empty-stencil if the new chord is at line-start. (if (and (equal? chord last-chord) (ly:context-property ctx 'chordChanges #f)) (ly:grob-set-property! grob 'after-line-breaking (lambda (grob) (if (at-line-beginning? grob) (ly:grob-set-property! grob 'stencil empty-stencil)) ;; keep default (ly:chord-name::after-line-breaking grob)))))) ((finalize this-engraver) ;; house keeping (set! chord #f) (set! last-chord #f))))) \new ChordNames \with { chordChanges = ##t \consists \My_chord_changes_engraver } \chordmode { d2 c~ \break c d } Cheers, Harm