From df3457d85ebfa4bc347a4569241227449f84b901 Mon Sep 17 00:00:00 2001 From: David Kastrup Date: Tue, 9 Sep 2014 11:14:34 +0200 Subject: [PATCH] Allow \addlyrics to work with arbitrary contexts --- lily/lyric-combine-music-iterator.cc | 24 +++++++++++------------- lily/parser.yy | 6 +++++- scm/ly-syntax-constructors.scm | 20 +++++++++++--------- 3 files changed, 27 insertions(+), 23 deletions(-) diff --git a/lily/lyric-combine-music-iterator.cc b/lily/lyric-combine-music-iterator.cc index 939a111b74..c0c1af5a61 100644 --- a/lily/lyric-combine-music-iterator.cc +++ b/lily/lyric-combine-music-iterator.cc @@ -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_) diff --git a/lily/parser.yy b/lily/parser.yy index 645b35b6ee..388ce46e51 100644 --- a/lily/parser.yy +++ b/lily/parser.yy @@ -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); } ; diff --git a/scm/ly-syntax-constructors.scm b/scm/ly-syntax-constructors.scm index 66f34cfceb..a427daadcc 100644 --- a/scm/ly-syntax-constructors.scm +++ b/scm/ly-syntax-constructors.scm @@ -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 -- 2.39.2