verwenden, um den Text einzugrenzen, für den Melismen ignoriert
werden sollen.
+@subsubheading Silben zu Verzierungsnoten hinzufügen
+
+Normalerweise werden Verzierungsnoten (z.B. durch @code{\grace}) bei
+@code{\lyricsto} keine Silben zugeordnet. Dieses Verhalten kann
+geändert werden, wie das folgende Beispiel zeigt.
+
+@lilypond[verbatim,ragged-right,quote]
+\relative c' {
+ f4 \appoggiatura a32 b4
+ \grace { f16[ a16] } b2
+ \afterGrace b2 { f16[ a16] }
+ \appoggiatura a32 b4
+ \acciaccatura a8 b4
+}
+\addlyrics {
+ normal
+ \set includeGraceNotes = ##t
+ case,
+ gra -- ce case,
+ after -- grace case,
+ \set ignoreMelismata = ##t
+ app. case,
+ acc. case.
+}
+@end lilypond
+
+@knownissues
+Wie bei @code{associatedVoice} muss @code{includeGraceNotes}
+spätestens eine Silbe vor derjenigen gesetzt werden, die unter einer
+Verzierungsnote stehen soll. Im Fall, dass eine Verzierungsnote
+die erste des Musikstückes ist, kann ein @code{\with}- oder
+@code{\context}-Block verwendet werden:
+
+@lilypond[verbatim,ragged-right,quote]
+<<
+ \new Voice = melody \relative c' {
+ \grace { c16[( d e f] }
+ g1) f
+ }
+ \new Lyrics \with { includeGraceNotes = ##t }
+ \lyricsto melody {
+ Ah __ fa
+ }
+>>
+@end lilypond
@subsubheading Zu einer alternativen Melodie umschalten
@code{\set} and @code{\unset} to bracket the lyrics where melismata
are to be ignored.
+@subsubheading Adding syllables to grace notes
+
+By default, grace notes (e.g. via @code{\grace}) do not get assigned
+syllables when using @code{\lyricsto}, but this behavior can be
+changed:
+
+@lilypond[verbatim,ragged-right,quote]
+\relative c' {
+ f4 \appoggiatura a32 b4
+ \grace { f16[ a16] } b2
+ \afterGrace b2 { f16[ a16] }
+ \appoggiatura a32 b4
+ \acciaccatura a8 b4
+}
+\addlyrics {
+ normal
+ \set includeGraceNotes = ##t
+ case,
+ gra -- ce case,
+ after -- grace case,
+ \set ignoreMelismata = ##t
+ app. case,
+ acc. case.
+}
+@end lilypond
+
+@knownissues
+Like for @code{associatedVoice}, @code{includeGraceNotes} needs to be
+set at latest one syllable before the one which is to be put under a
+grace note. For the case of a grace note at the very beginning of a
+piece of music, consider using a @code{\with} or @code{\context}
+block:
+
+@lilypond[verbatim,ragged-right,quote]
+<<
+ \new Voice = melody \relative c' {
+ \grace { c16[( d e f] }
+ g1) f
+ }
+ \new Lyrics \with { includeGraceNotes = ##t }
+ \lyricsto melody {
+ Ah __ fa
+ }
+>>
+@end lilypond
+
@subsubheading Switching to an alternative melody
More complex variations in text underlay are possible. It is possible
--- /dev/null
+\version "2.13.19"
+
+\header {
+ texidoc="
+If @code{includeGraceNotes} is enabled, lyric extenders work as
+expected also for syllables starting under grace notes.
+"
+}
+
+\relative c' {
+ c2 \grace { c16([ d e f] } g2)
+ f1
+}
+\addlyrics {
+ \set includeGraceNotes = ##t
+ _ Ah __ fa
+}
--- /dev/null
+\version "2.13.19"
+
+\header {
+ texidoc="
+Setting @code{includeGraceNotes} enables lyrics syllables to be
+assigned to grace notes.
+"
+}
+
+\relative c' {
+ f4 \appoggiatura a32 b4
+ \grace { f16[ a16] } b2
+ \afterGrace b2 { f16[ a16] }
+ \appoggiatura a32 b4
+ \acciaccatura a8 b4
+}
+\addlyrics {
+ normal
+ \set includeGraceNotes = ##t
+ case,
+ gra -- ce case,
+ after -- grace case,
+ \set ignoreMelismata = ##t
+ app. case,
+ acc. case.
+}
if (extender_ || pending_extender_)
{
Context *voice = get_voice_to_lyrics (context ());
- Grob *h = voice ? get_current_note_head (voice) : 0;
+ Grob *h = voice ? get_current_note_head (voice, to_boolean (get_property ("includeGraceNotes"))) : 0;
if (h)
{
"LyricExtender ",
/* read */
- "extendersOverRests ",
+ "extendersOverRests "
+ "includeGraceNotes ",
/* write */
""
bool melisma_busy (Context *);
Context *get_voice_to_lyrics (Context *lyrics);
-Grob *get_current_note_head (Context *voice);
+Grob *get_current_note_head (Context *voice, bool include_grace_notes);
Grob *get_current_rest (Context *voice);
DECLARE_UNSMOB (Context, context);
set_music_context (0);
}
-
if (music_context_
&& (start_new_syllable () ||
(busy_moment_ >= pending_grace_moment_))
&& lyric_iter_->ok ())
{
Moment now = music_context_->now_mom ();
- if (now.grace_part_)
+ if (now.grace_part_ && !to_boolean (lyrics_context_->get_property ("includeGraceNotes")))
{
pending_grace_moment_ = now;
pending_grace_moment_.grace_part_ = Rational (0);
{
pending_grace_moment_.set_infinite (1);
}
-
+
Moment m = lyric_iter_->pending_moment ();
lyrics_context_->set_property (ly_symbol2scm ("associatedVoiceContext"),
music_context_->self_scm ());
}
Grob *
-get_current_note_head (Context *voice)
+get_current_note_head (Context *voice, bool include_grace_notes)
{
Moment now = voice->now_mom ();
for (SCM s = voice->get_property ("busyGrobs");
continue;
}
- if (end_mom->main_part_ > now.main_part_
- && dynamic_cast<Item *> (g)
- && Note_head::has_interface (g))
- return g;
+ if (((end_mom->main_part_ > now.main_part_) ||
+ (include_grace_notes && end_mom->grace_part_ > now.grace_part_))
+ && dynamic_cast<Item *> (g)
+ && Note_head::has_interface (g))
+ {
+ return g;
+ }
}
return 0;
if (voice)
{
- Grob *head = get_current_note_head (voice);
+ bool include_grace_notes = to_boolean (get_property ("includeGraceNotes"));
+ Grob *head = get_current_note_head (voice, include_grace_notes);
if (head)
{
/* read */
"ignoreMelismata "
+ "includeGraceNotes "
"lyricMelismaAlignment ",
/* write */
printed as numbers, but only as extender lines.")
(implicitTimeSignatureVisibility ,vector? "break visibility for
the default time signature.")
+ (includeGraceNotes ,boolean? "Do not ignore grace notes for
+@rinternals{Lyrics}.")
(instrumentCueName ,markup? "The name to print if another
instrument is to be taken.")
(instrumentEqualizer ,procedure? "A function taking a string