]> git.donarmstrong.com Git - lilypond.git/commitdiff
Allow \addlyrics to work with arbitrary contexts
authorDavid Kastrup <dak@gnu.org>
Tue, 9 Sep 2014 09:14:34 +0000 (11:14 +0200)
committerDavid Kastrup <dak@gnu.org>
Sun, 14 Sep 2014 05:48:29 +0000 (07:48 +0200)
lily/lyric-combine-music-iterator.cc
lily/parser.yy
scm/ly-syntax-constructors.scm

index 939a111b74fcc72bad4fd2c7b0d16cc051134a63..c0c1af5a61a3c1834618661e19747599056c1532 100644 (file)
@@ -112,14 +112,14 @@ Lyric_combine_music_iterator::set_music_context (Context *to)
 {
   if (music_context_)
     {
-      music_context_->event_source ()->
+      music_context_->events_below ()->
       remove_listener (GET_LISTENER (set_busy), ly_symbol2scm ("rhythmic-event"));
     }
 
   music_context_ = to;
   if (to)
     {
-      to->event_source ()->add_listener (GET_LISTENER (set_busy),
+      to->events_below ()->add_listener (GET_LISTENER (set_busy),
                                          ly_symbol2scm ("rhythmic-event"));
     }
 }
@@ -258,17 +258,14 @@ Lyric_combine_music_iterator::find_voice ()
                 ? 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))
+  if (scm_is_string (running)) {
     voice_name = running;
-  if (scm_is_symbol (running_type))
-    voice_type = running_type;
+    voice_type = lyrics_context_->get_property ("associatedVoiceType");
+  }
 
   if (scm_is_string (voice_name)
       && (!music_context_ || ly_scm2string (voice_name) != music_context_->id_string ())
-      && scm_is_symbol (running_type))
+      && scm_is_symbol (voice_type))
     {
       Context *t = get_outlet ();
       while (t && t->get_parent_context ())
@@ -341,15 +338,16 @@ Lyric_combine_music_iterator::do_quit ()
   if (!music_found_)
     {
       SCM voice_name = get_music ()->get_property ("associated-context");
-
-      string name;
+      SCM voice_type = get_music ()->get_property ("associated-context-type");
+      string name, type;
       if (scm_is_string (voice_name))
         name = ly_scm2string (voice_name);
+      type = robust_symbol2string (voice_type, "Voice");
       /* Don't print a warning for empty lyrics (in which case we don't try
          to find the proper voice, so it will not be found) */
       if (lyrics_found_)
-        get_music ()->origin ()->warning (_f ("cannot find Voice `%s'",
-                                              name.c_str ()) + "\n");
+        get_music ()->origin ()->warning (_f ("cannot find %s `%s'",
+                                              type.c_str (), name.c_str ()) + "\n");
     }
 
   if (lyric_iter_)
index 645b35b6ee04147cbd31a545638ea5bcd8c93b9a..388ce46e51a58ba9e44c5f4c794e94df0dc59f26 100644 (file)
@@ -1455,7 +1455,11 @@ basic_music:
        | repeated_music
        | music_bare
        | LYRICSTO simple_string lyric_mode_music {
-               $$ = MAKE_SYNTAX ("lyric-combine", @$, $2, $3);
+               $$ = MAKE_SYNTAX ("lyric-combine", @$, $2, SCM_EOL, $3);
+       }
+       | LYRICSTO symbol '=' simple_string lyric_mode_music
+       {
+               $$ = MAKE_SYNTAX ("lyric_combine", @$, $3, $2, $4);
        }
        ;
 
index 66f34cfceb7c8819659ed0dfd3f68effb1c86d71..a427daadcca376d5e8dda561daf7c804dadc50ba 100644 (file)
@@ -207,11 +207,10 @@ into a @code{MultiMeasureTextEvent}."
                 'context-type ctx
                 'origin location)))
 
-(define (get-first-context-id! type mus)
-  "Find the name of a ContextSpeccedMusic with given type, possibly naming it"
+(define (get-first-context-id! mus)
+  "Find the name of a ContextSpeccedMusic, possibly naming it"
   (let ((id (ly:music-property mus 'context-id)))
-    (if (and (eq? (ly:music-property mus 'name) 'ContextSpeccedMusic)
-             (eq? (ly:music-property mus 'context-type) type))
+    (if (eq? (ly:music-property mus 'name) 'ContextSpeccedMusic)
         (if (and (string? id)
                  (not (string-null? id)))
             id
@@ -232,7 +231,7 @@ into a @code{MultiMeasureTextEvent}."
 (define-ly-syntax-simple (lyric-event text duration)
   (make-lyric-event text duration))
 
-(define (lyric-combine-music sync music loc)
+(define (lyric-combine-music sync sync-type music loc)
   ;; CompletizeExtenderEvent is added following the last lyric in MUSIC
   ;; to signal to the Extender_engraver that any pending extender should
   ;; be completed if the lyrics end before the associated voice.
@@ -241,13 +240,14 @@ into a @code{MultiMeasureTextEvent}."
   (make-music 'LyricCombineMusic
               'element music
               'associated-context sync
+              'associated-context-type sync-type
               'origin loc))
 
-(define-ly-syntax (lyric-combine parser location voice music)
-  (lyric-combine-music voice music location))
+(define-ly-syntax (lyric-combine parser location voice typ music)
+  (lyric-combine-music voice typ music location))
 
 (define-ly-syntax (add-lyrics parser location music addlyrics-list)
-  (let* ((existing-voice-name (get-first-context-id! 'Voice music))
+  (let* ((existing-voice-name (get-first-context-id! music))
          (voice-name (if (string? existing-voice-name)
                          existing-voice-name
                          (get-next-unique-voice-name)))
@@ -258,9 +258,11 @@ into a @code{MultiMeasureTextEvent}."
                                 'context-type 'Voice
                                 'context-id voice-name
                                 'origin (ly:music-property music 'origin))))
+         (voice-type (ly:music-property voice 'context-type))
          (lyricstos (map (lambda (mus)
                            (let* ((loc (ly:music-property mus 'origin))
-                                  (lyr (lyric-combine-music voice-name mus loc)))
+                                  (lyr (lyric-combine-music
+                                        voice-name voice-type mus loc)))
                              (make-music 'ContextSpeccedMusic
                                          'create-new #t
                                          'context-type 'Lyrics