From eaed6aa8f16502d8159530eaf3ed4d56dbf8fef8 Mon Sep 17 00:00:00 2001 From: Erik Sandberg Date: Mon, 3 Jul 2006 22:26:59 +0000 Subject: [PATCH] * lily/sequential-iterator.cc: Change the default get_music_list to read elements-callback music property * scm/define-music-types.scm, scm/music-functions.scm: Cleaner processing of multimeasure rests. Softcoded sequential-music-iterator. --- ChangeLog | 11 +++++ lily/include/sequential-music-iterator.hh | 26 ------------ lily/sequential-iterator.cc | 7 +++- lily/sequential-music-iterator.cc | 20 --------- scm/define-music-display-methods.scm | 15 ++++--- scm/define-music-properties.scm | 1 + scm/define-music-types.scm | 41 ++++++++++++------- scm/ly-syntax-constructors.scm | 23 +++++++---- scm/music-functions.scm | 50 +---------------------- 9 files changed, 71 insertions(+), 123 deletions(-) delete mode 100644 lily/include/sequential-music-iterator.hh delete mode 100644 lily/sequential-music-iterator.cc diff --git a/ChangeLog b/ChangeLog index cc751a7e28..28f0389beb 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,14 @@ +2006-07-03 Erik Sandberg + + * lily/sequential-iterator.cc: Change the default get_music_list + to read elements-callback music property + + * scm/define-music-types.scm, scm/music-functions.scm: Cleaner + processing of multimeasure rests. Softcoded + sequential-music-iterator. + + * lily/sequential-music-iterator.cc: Removed. + 2006-06-28 Graham Percival * Documentation/user/basic-notation.itely: clarify \repeatTie. diff --git a/lily/include/sequential-music-iterator.hh b/lily/include/sequential-music-iterator.hh deleted file mode 100644 index a70d7bcd40..0000000000 --- a/lily/include/sequential-music-iterator.hh +++ /dev/null @@ -1,26 +0,0 @@ -/* - Sequential_music-iterator.hh -- declare Sequential_music_iterator - - source file of the GNU LilyPond music typesetter - - (c) 1997--2006 Han-Wen Nienhuys -*/ - -#ifndef SEQUENTIAL_MUSIC_ITERATOR_HH -#define SEQUENTIAL_MUSIC_ITERATOR_HH - -#include "sequential-iterator.hh" - -/** Sequential_music iteration: walk each element in turn, and - construct an iterator for every element. -*/ -class Sequential_music_iterator : public Sequential_iterator -{ -public: - DECLARE_SCHEME_CALLBACK (constructor, ()); - DECLARE_CLASSNAME(Sequential_music_iterator); -private: - virtual SCM get_music_list ()const; -}; - -#endif // SEQUENTIAL_MUSIC_ITERATOR_HH diff --git a/lily/sequential-iterator.cc b/lily/sequential-iterator.cc index 214d1c2e67..db8eb5865e 100644 --- a/lily/sequential-iterator.cc +++ b/lily/sequential-iterator.cc @@ -42,7 +42,12 @@ Sequential_iterator::Sequential_iterator () SCM Sequential_iterator::get_music_list () const { - return SCM_EOL; + Music *m = get_music (); + SCM proc = m->get_property ("elements-callback"); + if (scm_procedure_p (proc)) + return scm_call_1 (proc, m->self_scm ()); + else + return SCM_EOL; } void diff --git a/lily/sequential-music-iterator.cc b/lily/sequential-music-iterator.cc deleted file mode 100644 index f933df7bb4..0000000000 --- a/lily/sequential-music-iterator.cc +++ /dev/null @@ -1,20 +0,0 @@ -/* - sequential-music-iterator.cc -- implement Sequential_music_iterator - - source file of the GNU LilyPond music typesetter - - (c) 1997--2006 Han-Wen Nienhuys -*/ - -#include "context.hh" -#include "sequential-music-iterator.hh" -#include "music.hh" -#include "warn.hh" - -IMPLEMENT_CTOR_CALLBACK (Sequential_music_iterator); - -SCM -Sequential_music_iterator::get_music_list ()const -{ - return get_music ()->get_property ("elements"); -} diff --git a/scm/define-music-display-methods.scm b/scm/define-music-display-methods.scm index ad1dbf3de7..2dbb0acb02 100644 --- a/scm/define-music-display-methods.scm +++ b/scm/define-music-display-methods.scm @@ -481,11 +481,14 @@ Otherwise, return #f." ;; command_element (format #f "~{~a ~}" (map-in-order music->lily-string elements)))))))) -(define-display-method MultiMeasureRestMusicGroup (mmrest) - (format #f "~{~a ~}" - (map-in-order music->lily-string - (remove (make-music-type-predicate 'BarCheck) - (ly:music-property mmrest 'elements))))) +(define-display-method MultiMeasureRest (mmrest) + (let* ((dur (ly:music-property mmrest 'duration)) + (ly (format #f "R~a~{~a ~}" + (duration->lily-string dur) + (map-in-order music->lily-string + (ly:music-property mmrest 'articulations))))) + (*previous-duration* dur) + ly)) (define-display-method SkipMusic (skip) (format #f "\\skip ~a" (duration->lily-string (ly:music-property skip 'duration) #:force-duration #t))) @@ -547,7 +550,7 @@ Otherwise, return #f." (define-display-method MetronomeChangeEvent (tempo) (format #f "\\tempo ~a = ~a" - (duration->lily-string (ly:music-property tempo 'tempo-unit) #:force-duration #f #:prev-duration #f) + (duration->lily-string (ly:music-property tempo 'tempo-unit) #:force-duration #t #:prev-duration #f) (ly:music-property tempo 'metronome-count))) (define-display-method KeyChangeEvent (key) diff --git a/scm/define-music-properties.scm b/scm/define-music-properties.scm index a681f2b6c3..9bf878ed6a 100644 --- a/scm/define-music-properties.scm +++ b/scm/define-music-properties.scm @@ -50,6 +50,7 @@ TODO: consider making type into symbol ") (error-found ,boolean? "If true, a parsing error was found in this expression") (element ,ly:music? "The single child of a Music_wrapper music object, or the body of a repeat.") (elements ,ly:music-list? "A list of elements for sequential of simultaneous music, or the alternatives of repeated music. ") + (elements-callback ,procedure? "Return a list of children, for use by a sequential iterator. Takes a single Music parameter") (expected-beam-count ,integer? "Expected number of non-tremolo beams in a tremolo repeat") (force-accidental ,boolean? "If set, a cautionary accidental should always be printed on this note") (grob-property ,symbol? "The symbol of the grob property to set. ") diff --git a/scm/define-music-types.scm b/scm/define-music-types.scm index fe31b3d40f..bf8da68d31 100644 --- a/scm/define-music-types.scm +++ b/scm/define-music-types.scm @@ -7,6 +7,20 @@ ;; TODO: should link back into user manual. +(define (mm-rest-child-list music) + "Check if we have R1*4-\\markup { .. }, and if applicable convert to +a property set for MultiMeasureRestNumber." + (let ((location (ly:music-property music 'origin)) + (duration (ly:music-property music 'duration))) + (list (make-music 'BarCheck + 'origin location) + (make-event-chord (cons (make-music 'MultiMeasureRestEvent + 'origin location + 'duration duration) + (ly:music-property music 'articulations))) + (make-music 'BarCheck + 'origin location)))) + (define-public music-descriptions `( (AbsoluteDynamicEvent @@ -281,26 +295,22 @@ e.g. @code{\\mark \"A\"}.") Syntax: @code{c4\\melisma d\\melismaEnd}.") (types . (general-music melisma-span-event event)) )) - - (MultiMeasureRestEvent + + (MultiMeasureRest . ( (description . "Rests that may be compressed into Multi rests. Syntax -@code{R2.*4} for 4 measures in 3/4 time. Note the capital R.") - (types . (general-music event rhythmic-event multi-measure-rest-event)) +@code{R2.*4} for 4 measures in 3/4 time.") + (iterator-ctor . ,ly:sequential-iterator::constructor) + (elements-callback . ,mm-rest-child-list) + (types . (general-music multi-measure-rest)) )) - - (MultiMeasureRestMusicGroup - . ( - (description . "Like sequential-music, but specifically intended -to group start-mmrest, skip, stop-mmrest sequence. -Syntax @code{R2.*5} for 5 measures in 3/4 time.") - (length-callback . ,ly:music-sequence::cumulative-length-callback) - (start-callback . ,ly:music-sequence::first-start-callback) - (iterator-ctor . ,ly:sequential-music-iterator::constructor) - (types . (general-music sequential-music)) + (MultiMeasureRestEvent + . ( + (description . "Used internally by MultiMeasureRest to signal rests") + (types . (general-music event rhythmic-event multi-measure-rest-event)) )) (MultiMeasureTextEvent @@ -445,7 +455,8 @@ Syntax \\sequential @{..@} or simply @{..@} .") (length-callback . ,ly:music-sequence::cumulative-length-callback) (start-callback . ,ly:music-sequence::first-start-callback) - (iterator-ctor . ,ly:sequential-music-iterator::constructor) + (elements-callback . ,(lambda (m) (ly:music-property m 'elements))) + (iterator-ctor . ,ly:sequential-iterator::constructor) (types . (general-music sequential-music)) )) diff --git a/scm/ly-syntax-constructors.scm b/scm/ly-syntax-constructors.scm index cd4a0f9374..44ab47e03c 100644 --- a/scm/ly-syntax-constructors.scm +++ b/scm/ly-syntax-constructors.scm @@ -85,14 +85,23 @@ (define-ly-syntax-simple (repeat type num body alts) (make-repeat type num body alts)) -;; UGH. TODO: represent mm rests in a decent way as music expressions. -;; Also eliminate glue-mm-rests while we are at it. +(define (script-to-mmrest-text music) + "Extract 'direction and 'text from SCRIPT-MUSIC, and transform MultiMeasureTextEvent" + (if (memq 'script-event (ly:music-property music 'types)) + + (let ((dir (ly:music-property music 'direction)) + (p (make-music 'MultiMeasureTextEvent + 'text (ly:music-property music 'text)))) + (if (ly:dir? dir) + (set! (ly:music-property p 'direction) dir)) + p) + music)) + (define-ly-syntax (multi-measure-rest parser location duration articulations) - (let* ((mus (make-multi-measure-rest duration location)) - (elts (ly:music-property mus 'elements))) - (set! (ly:music-property mus 'elements) - (append elts articulations)) - mus)) + (make-music 'MultiMeasureRest + 'articulations (map script-to-mmrest-text articulations) + 'duration duration + 'origin location)) (define-ly-syntax-simple (context-specification type id mus ops create-new) (let* ((type-sym (if (symbol? type) type (string->symbol type))) diff --git a/scm/music-functions.scm b/scm/music-functions.scm index e33e1629af..e20e0bef35 100644 --- a/scm/music-functions.scm +++ b/scm/music-functions.scm @@ -387,54 +387,9 @@ i.e. this is not an override" ;; mmrest (define-public (make-multi-measure-rest duration location) - (make-music 'MultiMeasureRestMusicGroup + (make-music 'MultiMeasureRest 'origin location - 'elements (list (make-music 'BarCheck - 'origin location) - (make-event-chord (list (make-music 'MultiMeasureRestEvent - 'origin location - 'duration duration))) - (make-music 'BarCheck - 'origin location)))) - -(define-public (glue-mm-rest-texts music) - "Check if we have R1*4-\\markup { .. }, and if applicable convert to -a property set for MultiMeasureRestNumber." - (define (script-to-mmrest-text script-music) - "Extract 'direction and 'text from SCRIPT-MUSIC, and transform MultiMeasureTextEvent" - (let ((dir (ly:music-property script-music 'direction)) - (p (make-music 'MultiMeasureTextEvent - 'text (ly:music-property script-music 'text)))) - (if (ly:dir? dir) - (set! (ly:music-property p 'direction) dir)) - p)) - - (if (eq? (ly:music-property music 'name) 'MultiMeasureRestMusicGroup) - (let* ((text? (lambda (x) (memq 'script-event (ly:music-property x 'types)))) - (event? (lambda (x) (memq 'event (ly:music-property x 'types)))) - (group-elts (ly:music-property music 'elements)) - (texts '()) - (events '()) - (others '())) - - (set! texts - (map script-to-mmrest-text (filter text? group-elts))) - (set! group-elts - (remove text? group-elts)) - - (set! events (filter event? group-elts)) - (set! others (remove event? group-elts)) - - (if (or (pair? texts) (pair? events)) - (set! (ly:music-property music 'elements) - (cons (make-event-chord - (append texts events)) - others))) - - )) - - music) - + 'duration duration)) (define-public (make-property-set sym val) (make-music 'PropertySet @@ -852,7 +807,6 @@ if appropriate. (define-public toplevel-music-functions (list (lambda (music parser) (voicify-music music)) - (lambda (x parser) (music-map glue-mm-rest-texts x)) (lambda (x parser) (music-map music-check-error x)) (lambda (x parser) (music-map precompute-music-length x)) (lambda (music parser) -- 2.39.2