]> git.donarmstrong.com Git - lilypond.git/commitdiff
Allow associatedVoice to be of different type than Voice
authorDavid Kastrup <dak@gnu.org>
Tue, 9 Sep 2014 08:15:35 +0000 (10:15 +0200)
committerDavid Kastrup <dak@gnu.org>
Sun, 14 Sep 2014 05:48:29 +0000 (07:48 +0200)
lily/lyric-combine-music-iterator.cc
lily/lyric-engraver.cc
ly/engraver-init.ly
scm/define-context-properties.scm
scm/define-music-properties.scm

index dfc616e0d5f00b8ab6fe91d06600e4ee6ddfd5c7..939a111b74fcc72bad4fd2c7b0d16cc051134a63 100644 (file)
@@ -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;
index 100984062bcb28486e93fbc1cb3b8df90409dd4c..d4bbe64a988eef85e828ef9ad7625db61fd16afe 100644 (file)
@@ -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 ();
     }
 
index 4c61334d4033ff5245816d22e5a9d7978284528e..a222e6a7bae768bce128a57c74dac0322df5e2a9 100644 (file)
@@ -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"
index 5f92397dca3bbe9ad206af59cd302dd9aed82c71..f694a677785e161377c386b352eac6d764918acb 100644 (file)
@@ -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.
index 42525bb8b290165191918a0b638aa5699d291174..f20952b56fe75bb926df362d80b14e68c24237cf 100644 (file)
@@ -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).")