From 462c01a26eb3b309e70415ea91fbf5c97a204fad Mon Sep 17 00:00:00 2001 From: David Kastrup Date: Tue, 9 Sep 2014 10:15:35 +0200 Subject: [PATCH] Allow associatedVoice to be of different type than Voice --- lily/lyric-combine-music-iterator.cc | 20 +++++++++++++++++--- lily/lyric-engraver.cc | 8 ++++++-- ly/engraver-init.ly | 1 + scm/define-context-properties.scm | 5 ++++- scm/define-music-properties.scm | 4 +++- 5 files changed, 31 insertions(+), 7 deletions(-) diff --git a/lily/lyric-combine-music-iterator.cc b/lily/lyric-combine-music-iterator.cc index dfc616e0d5..939a111b74 100644 --- a/lily/lyric-combine-music-iterator.cc +++ b/lily/lyric-combine-music-iterator.cc @@ -67,6 +67,7 @@ private: Context *lyrics_context_; Context *music_context_; SCM lyricsto_voice_name_; + SCM lyricsto_voice_type_; Moment busy_moment_; Moment pending_grace_moment_; @@ -83,6 +84,8 @@ Lyric_combine_music_iterator::Lyric_combine_music_iterator () music_context_ = 0; lyrics_context_ = 0; busy_moment_.set_infinite (-1); + lyricsto_voice_name_ = SCM_UNDEFINED; + lyricsto_voice_type_ = SCM_UNDEFINED; } /* @@ -171,6 +174,8 @@ Lyric_combine_music_iterator::derived_mark ()const scm_gc_mark (lyrics_context_->self_scm ()); if (music_context_) scm_gc_mark (music_context_->self_scm ()); + scm_gc_mark (lyricsto_voice_name_); + scm_gc_mark (lyricsto_voice_type_); } void @@ -200,6 +205,9 @@ Lyric_combine_music_iterator::construct_children () } lyricsto_voice_name_ = get_music ()->get_property ("associated-context"); + lyricsto_voice_type_ = get_music ()->get_property ("associated-context-type"); + if (!scm_is_symbol (lyricsto_voice_type_)) + lyricsto_voice_type_ = ly_symbol2scm ("Voice"); Context *voice = find_voice (); if (voice) @@ -249,19 +257,25 @@ Lyric_combine_music_iterator::find_voice () SCM running = lyrics_context_ ? lyrics_context_->get_property ("associatedVoice") : SCM_EOL; - + SCM voice_type = lyricsto_voice_type_; + SCM running_type = lyrics_context_ + ? lyrics_context_->get_property ("associatedVoiceType") + : SCM_EOL; if (scm_is_string (running)) voice_name = running; + if (scm_is_symbol (running_type)) + voice_type = running_type; if (scm_is_string (voice_name) - && (!music_context_ || ly_scm2string (voice_name) != music_context_->id_string ())) + && (!music_context_ || ly_scm2string (voice_name) != music_context_->id_string ()) + && scm_is_symbol (running_type)) { Context *t = get_outlet (); while (t && t->get_parent_context ()) t = t->get_parent_context (); string name = ly_scm2string (voice_name); - return find_context_below (t, ly_symbol2scm ("Voice"), name); + return find_context_below (t, voice_type, name); } return 0; diff --git a/lily/lyric-engraver.cc b/lily/lyric-engraver.cc index 100984062b..d4bbe64a98 100644 --- a/lily/lyric-engraver.cc +++ b/lily/lyric-engraver.cc @@ -112,11 +112,15 @@ get_voice_to_lyrics (Context *lyrics) nm = nm.substr (0, idx); } + SCM voice_type = lyrics->get_property ("associatedVoiceType"); + if (!scm_is_symbol (voice_type)) + return 0; + Context *parent = lyrics; Context *voice = 0; while (parent && !voice) { - voice = find_context_below (parent, ly_symbol2scm ("Voice"), nm); + voice = find_context_below (parent, voice_type, nm); parent = parent->get_parent_context (); } @@ -127,7 +131,7 @@ get_voice_to_lyrics (Context *lyrics) voice = 0; while (parent && !voice) { - voice = find_context_below (parent, ly_symbol2scm ("Voice"), ""); + voice = find_context_below (parent, voice_type, ""); parent = parent->get_parent_context (); } diff --git a/ly/engraver-init.ly b/ly/engraver-init.ly index 4c61334d40..a222e6a7ba 100644 --- a/ly/engraver-init.ly +++ b/ly/engraver-init.ly @@ -592,6 +592,7 @@ automatically when an output definition (a @code{\\score} or drumStyleTable = #drums-style + associatedVoiceType = #'Voice melismaBusyProperties = #default-melisma-properties tieWaitForNote = ##f clefGlyph = #"clefs.G" diff --git a/scm/define-context-properties.scm b/scm/define-context-properties.scm index 5f92397dca..f694a67778 100644 --- a/scm/define-context-properties.scm +++ b/scm/define-context-properties.scm @@ -63,7 +63,10 @@ suffixes. No setting will not go back in measure-number time.") (alternativeRestores ,symbol-list? "Timing variables that are restored to their value at the end of the first alternative in subsequent alternatives.") - (associatedVoice ,string? "Name of the @code{Voice} that has the + (associatedVoice ,string? "Name of the context (see +@code{associatedVoiceType} for its type, usually @code{Voice}) that +has the melody for this @code{Lyrics} line.") + (associatedVoiceType ,symbol? "Type of the context that has the melody for this @code{Lyrics} line.") (autoAccidentals ,list? "List of different ways to typeset an accidental. diff --git a/scm/define-music-properties.scm b/scm/define-music-properties.scm index 42525bb8b2..f20952b56f 100644 --- a/scm/define-music-properties.scm +++ b/scm/define-music-properties.scm @@ -39,7 +39,9 @@ lettering should be incremented.") TODO: Consider making type into symbol.") (articulations ,ly:music-list? "Articulation events specifically for this note.") - (associated-context ,string? "Name of the Voice context associated with + (associated-context ,string? "Name of the context associated with +this @code{\\lyricsto} section.") + (associated-context-type ,symbol? "Type of the context associated with this @code{\\lyricsto} section.") (augmented ,boolean? "This figure is for an augmented figured bass (with @code{+} sign).") -- 2.39.5