Le 09/04/2021 à 17:15, Matthew Probst a écrit :
I've been using Lilypond to create lead sheets for a band that I'm in,
and it works great for that. Between that and a website I use for
generating simple chord charts, we're covered for our notation purposes.
I have some less skilled note readers in the band--they can read
rhythm notation, and get a general idea of melody shape from the notes
on the staff, but things go easier if they can see the note names for
each note under the staff. That's easy with LilyPond:
LeadStaffWithNoteNames = \new Staff \with {
instrumentName = #"Lead (notes)"
}
{
<<
\relative c'' {
\HomeKey
\clef treble
\LeadIntroFull
\LeadHeadFull
}
\context NoteNames {
\set printOctaveNames = ##f
\LeadIntroFull
\LeadHeadFull
}
>>
}
This works great, except for one cosmetic issue: For tied notes, the
note name is repeated for the second, third, etc. tied note. While my
weaker note-readers can comprehend this given that they can grasp the
rhythmic notation, it's a bit of a hassle.
Is there any good way to automate printing of note names underneath
the staff while avoiding repetitions of the note name during ties? I
did a search of the snippets repository and the documentation for
Lilypond 2.22.0, which I'm using. I'm guessing that it might require
custom Scheme instead of just configuration parameters, but I might be
wrong. I know Scheme the language and Lilypond the markup language,
but not Lilypond the Scheme API. I'm willing to do lifting on the
code myself but would welcome pointers on how might be best to
accomplish it. so I can best direct my learning.
Hello,
You want a custom Scheme engraver. Just a
few days ago I announced a document with
details about those:
https://lists.gnu.org/archive/html/lilypond-user/2021-04/msg00051.html
More precisely, engravers are explained here:
https://extending-lilypond.readthedocs.io/en/latest/translation.html#writing-an-engraver
Moreover, you need to draw a relation between
the Voice and NoteNames contexts. One way
to do so is to define a custom context type,
as documented at
https://lilypond.org/doc/v2.22/Documentation/notation/defining-new-contexts
All in all, this gives:
\version "2.22.0"
#(define (No_note_name_on_tied_note_engraver context)
(let ((note-name #f)
(ending-tie #f))
(make-engraver
(acknowledgers
((note-name-interface engraver grob source-engraver)
(set! note-name grob)))
(end-acknowledgers
((tie-interface engraver grob source-engraver)
(set! ending-tie grob)))
((stop-translation-timestep engraver)
(if ending-tie
(ly:grob-suicide! note-name))
(set! note-name #f)
(set! ending-tie #f)))))
\layout {
\context {
\Score
\accepts NoteNameContainer
}
\context {
\name NoteNameContainer
\type Engraver_group
\accepts Staff
\accepts NoteNames
\consists #No_note_name_on_tied_note_engraver
}
\context {
\NoteNames
printOctaveNames = ##f
}
}
notes = { c'1~ c' }
moreNotes = {
\set tieWaitForNote = ##t
d8~ d~ d~ d d4..~ e16 d1
}
<<
\new NoteNameContainer <<
\new Voice \notes
\new NoteNames \notes
>>
\new NoteNameContainer <<
\new Voice \moreNotes
\new NoteNames \moreNotes
>>
>>
Best regards,
Jean