> You shouldn't worry too much about this; it's a technical limitation
> of the way lyrics are processed, which also affects the property
> associatedVoice
> (http://lilypond.org/doc/v2.13/Documentation/notation/stanzas#Stanzas-with-different-rhythms).
> It's fine as long as you document it as a known issue.
>
> A \with { } or \context { } block would be a suitable workaround in
> this case.
Thanks again for your help. I quickly added a @knownissues to the docs
of the feature and added your code from below as an example for a
solution (if this is overkill, it's easily removed again).
> Now that I've had chance to test the patch a bit more, there's one
> more serious issue which needs fixing: melismata on graces end
> prematurely when followed directly by another lyric.
>
> <<
> \new Voice = melody \relative c' {
> \grace { c16[( d e f] }
> g1) f
> }
> \new Lyrics \with { includeGraceNotes = ##t }
> \lyricsto melody {
> Ah __ fa
> }
> >>
I slightly modified the regression test for the lyric extender towards
your example.
> The automatic melisma (from the slur) should continue to the note
> following the graces, but ends too early.
Even if I have to admit that I don't really understand it, this issue
seems to be fixed by changing the patch as follows:
--- a/lily/lyric-combine-music-iterator.cc
+++ b/lily/lyric-combine-music-iterator.cc
@@ -299,12 +299,11 @@ Lyric_combine_music_iterator::process (Moment /*
when */) && 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);
- if (!to_boolean (lyrics_context_->get_property
("includeGraceNotes")))
- return;
+ return;
}
else
Actually I even had it that way in the beginning but tried to
"optimize" ... but anyway: the attached patch contains all changes
described above.
Cheers,
Richard
From 15c62a8c22226c81d8652e2b808f7abf82f290c3 Mon Sep 17 00:00:00 2001
From: Richard Gay <richard....@t-online.de>
Date: Tue, 13 Apr 2010 01:23:54 +0200
Subject: [PATCH] includeGraceNotes: lyrics syllables of grace notes
---
Documentation/de/notation/vocal.itely | 47 +++++++++++++++++++++
Documentation/notation/vocal.itely | 48 ++++++++++++++++++++++
input/regression/lyric-extender-includegraces.ly | 16 +++++++
input/regression/lyrics-includegraces.ly | 26 ++++++++++++
lily/extender-engraver.cc | 5 +-
lily/include/context.hh | 2 +-
lily/lyric-combine-music-iterator.cc | 5 +-
lily/lyric-engraver.cc | 17 +++++---
scm/define-context-properties.scm | 2 +
9 files changed, 156 insertions(+), 12 deletions(-)
create mode 100644 input/regression/lyric-extender-includegraces.ly
create mode 100644 input/regression/lyrics-includegraces.ly
diff --git a/Documentation/de/notation/vocal.itely b/Documentation/de/notation/vocal.itely
index 9393cc6..e6b2588 100644
--- a/Documentation/de/notation/vocal.itely
+++ b/Documentation/de/notation/vocal.itely
@@ -1194,6 +1194,53 @@ Es ist notwendig, explizit @code{\set} und @code{\unset} zu
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
diff --git a/Documentation/notation/vocal.itely b/Documentation/notation/vocal.itely
index 34f6cc4..6afdcf7 100644
--- a/Documentation/notation/vocal.itely
+++ b/Documentation/notation/vocal.itely
@@ -1152,6 +1152,54 @@ not work if prefixed with @code{\once}. It is necessary to use
@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
diff --git a/input/regression/lyric-extender-includegraces.ly b/input/regression/lyric-extender-includegraces.ly
new file mode 100644
index 0000000..4056d49
--- /dev/null
+++ b/input/regression/lyric-extender-includegraces.ly
@@ -0,0 +1,16 @@
+\version "2.13.18"
+
+\header {
+ texidoc="
+Setting @code{includeGraceNotes} enables lyrics syllables to be
+assigned to grace notes.
+"
+}
+
+\relative c' {
+ c2 \grace { c16([ d e f] } g2) f1
+}
+\addlyrics {
+ \set includeGraceNotes = ##t
+ _ Ah __ fa
+}
diff --git a/input/regression/lyrics-includegraces.ly b/input/regression/lyrics-includegraces.ly
new file mode 100644
index 0000000..81029c7
--- /dev/null
+++ b/input/regression/lyrics-includegraces.ly
@@ -0,0 +1,26 @@
+\version "2.13.18"
+
+\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.
+}
diff --git a/lily/extender-engraver.cc b/lily/extender-engraver.cc
index 097b479..9936170 100644
--- a/lily/extender-engraver.cc
+++ b/lily/extender-engraver.cc
@@ -100,7 +100,7 @@ Extender_engraver::stop_translation_timestep ()
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)
{
@@ -197,7 +197,8 @@ ADD_TRANSLATOR (Extender_engraver,
"LyricExtender ",
/* read */
- "extendersOverRests ",
+ "extendersOverRests "
+ "includeGraceNotes ",
/* write */
""
diff --git a/lily/include/context.hh b/lily/include/context.hh
index 45e94ab..4aa6c55 100644
--- a/lily/include/context.hh
+++ b/lily/include/context.hh
@@ -146,7 +146,7 @@ Context *find_context_below (Context *where,
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);
diff --git a/lily/lyric-combine-music-iterator.cc b/lily/lyric-combine-music-iterator.cc
index 7b304cf..7b4732e 100644
--- a/lily/lyric-combine-music-iterator.cc
+++ b/lily/lyric-combine-music-iterator.cc
@@ -293,14 +293,13 @@ Lyric_combine_music_iterator::process (Moment /* when */)
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);
@@ -310,7 +309,7 @@ Lyric_combine_music_iterator::process (Moment /* when */)
{
pending_grace_moment_.set_infinite (1);
}
-
+
Moment m = lyric_iter_->pending_moment ();
lyrics_context_->set_property (ly_symbol2scm ("associatedVoiceContext"),
music_context_->self_scm ());
diff --git a/lily/lyric-engraver.cc b/lily/lyric-engraver.cc
index 999efaa..3ec47cc 100644
--- a/lily/lyric-engraver.cc
+++ b/lily/lyric-engraver.cc
@@ -127,7 +127,7 @@ get_voice_to_lyrics (Context *lyrics)
}
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");
@@ -141,10 +141,13 @@ get_current_note_head (Context *voice)
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;
@@ -159,7 +162,8 @@ Lyric_engraver::stop_translation_timestep ()
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)
{
@@ -191,6 +195,7 @@ ADD_TRANSLATOR (Lyric_engraver,
/* read */
"ignoreMelismata "
+ "includeGraceNotes "
"lyricMelismaAlignment ",
/* write */
diff --git a/scm/define-context-properties.scm b/scm/define-context-properties.scm
index 16b2538..5f937f6 100644
--- a/scm/define-context-properties.scm
+++ b/scm/define-context-properties.scm
@@ -267,6 +267,8 @@ string selector for tablature notation.")
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
--
1.6.4.4
_______________________________________________
lilypond-devel mailing list
lilypond-devel@gnu.org
http://lists.gnu.org/mailman/listinfo/lilypond-devel