From: Han-Wen Nienhuys Date: Fri, 19 Mar 2004 00:49:58 +0000 (+0000) Subject: * scm/music-functions.scm (descend-to-context): new X-Git-Tag: release/2.1.32~16 X-Git-Url: https://git.donarmstrong.com/?a=commitdiff_plain;h=c3214d7d27899529e67f9e57850167775eaf675d;p=lilypond.git * scm/music-functions.scm (descend-to-context): new function. Similar to context-spec-music. (make-time-signature-set): specify Score as descend-only. This fixes the polymetric.ly example. * lily/context-specced-music-iterator.cc (construct_children): add support for descend-only context spec. --- diff --git a/ChangeLog b/ChangeLog index f6f898137c..8b2871aff8 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,13 @@ 2004-03-19 Han-Wen Nienhuys + * scm/music-functions.scm (descend-to-context): new + function. Similar to context-spec-music. + (make-time-signature-set): specify Score as descend-only. This + fixes the polymetric.ly example. + + * lily/context-specced-music-iterator.cc (construct_children): add + support for descend-only context spec. + * lily/note-head.cc (brew_ez_stencil): read vector note-names to determine ez-notation letter. diff --git a/lily/context-specced-music-iterator.cc b/lily/context-specced-music-iterator.cc index dc4992e36c..2f7445fd67 100644 --- a/lily/context-specced-music-iterator.cc +++ b/lily/context-specced-music-iterator.cc @@ -32,9 +32,15 @@ Context_specced_music_iterator::construct_children () Context * a = get_outlet ()->find_create_context (ct, c_id, ops); + if (a + && to_boolean (get_music ()->get_property ("descend-only")) + && !is_child_context (get_outlet (), a)) + a = 0; + if (a) set_translator (a); Music_wrapper_iterator::construct_children (); } + IMPLEMENT_CTOR_CALLBACK (Context_specced_music_iterator); diff --git a/lily/include/music-iterator.hh b/lily/include/music-iterator.hh index 14f4aad5d1..d35f58cac5 100644 --- a/lily/include/music-iterator.hh +++ b/lily/include/music-iterator.hh @@ -117,6 +117,7 @@ private: Music * music_; }; +bool is_child_context (Context *me, Context *child); #define IMPLEMENT_CTOR_CALLBACK(Class) \ LY_DEFINE_MEMBER_FUNCTION(Class,constructor, #Class "::constructor",\ diff --git a/lily/music-iterator.cc b/lily/music-iterator.cc index 9fc288866e..43e28e3ebd 100644 --- a/lily/music-iterator.cc +++ b/lily/music-iterator.cc @@ -237,6 +237,18 @@ Music_iterator::run_always ()const return false; } + +bool +is_child_context (Context *me, Context *child) +{ + while (child && child != me) + { + child = child->daddy_context_; + } + + return child == me; +} + /* move to context of child iterator if it is deeper down in the hierarchy. @@ -245,13 +257,6 @@ void Music_iterator::descend_to_child (Context * child_report) { Context * me_report = get_outlet (); - - Context * c = child_report; - while (c && c != me_report) - { - c = c->daddy_context_; - } - - if (c == me_report) + if (is_child_context (me_report, child_report)) set_translator (child_report); } diff --git a/lily/translator-scheme.cc b/lily/translator-scheme.cc index 1129a7b99a..c32b13b017 100644 --- a/lily/translator-scheme.cc +++ b/lily/translator-scheme.cc @@ -36,9 +36,11 @@ LY_DEFINE (ly_translator_description, "ly:translator-description", int Translator::print_smob (SCM s, SCM port, scm_print_state *) { - Translator *sc = (Translator*) ly_cdr (s); + Translator *me = (Translator*) ly_cdr (s); scm_puts ("#simple_trans_list_, port); + scm_puts (" >", port); return 1; } diff --git a/scm/define-music-properties.scm b/scm/define-music-properties.scm index e7cc07e34f..6252131af5 100644 --- a/scm/define-music-properties.scm +++ b/scm/define-music-properties.scm @@ -43,6 +43,8 @@ TODO: consider making type into symbol ") (compress-procedure ,procedure? "compress this music expression. Argument 1: the music, arg 2: factor") (context-id ,string? "name of context") (context-type ,symbol? "type of context") + (descend-only ,boolean? "If set, this @code{\\context} will only +descend in the context tree.") (denominator ,integer? "denominator in a time signature") (digit ,integer? "digit for fingering") (direction ,ly:dir? "Print this up or down?") diff --git a/scm/music-functions.scm b/scm/music-functions.scm index c366fbd5e3..64dde86fc7 100644 --- a/scm/music-functions.scm +++ b/scm/music-functions.scm @@ -211,6 +211,13 @@ i.e. this is not an override" (set! (ly:music-property cm 'context-id) id)) cm)) + +(define*-public (descend-to-context m context) + "Like context-spec-music, but only descending. " + (let ((cm (context-spec-music m context))) + (ly:music-set-property! cm 'descend-only #t) + cm)) + (define-public (make-apply-context func) (make-music 'ApplyContext 'procedure func)) @@ -304,9 +311,7 @@ OTTAVATION to `8va', or whatever appropriate." (define-public (make-time-signature-set num den . rest) " Set properties for time signature NUM/DEN. -Rest can contain a list of beat groupings - -" +Rest can contain a list of beat groupings " (let* ((set1 (make-property-set 'timeSignatureFraction (cons num den))) (beat (ly:make-moment 1 den)) (len (ly:make-moment num den)) @@ -316,7 +321,7 @@ Rest can contain a list of beat groupings (car rest) '()))) (basic (list set1 set2 set3 set4))) - (context-spec-music + (descend-to-context (context-spec-music (make-sequential-music basic) 'Timing) 'Score))) (define-public (make-mark-set label)