Index: lily/sequential-iterator.cc =================================================================== RCS file: /sources/lilypond/lilypond/lily/sequential-iterator.cc,v retrieving revision 1.42 diff -u -r1.42 sequential-iterator.cc --- lily/sequential-iterator.cc 18 Jun 2006 12:57:37 -0000 1.42 +++ lily/sequential-iterator.cc 27 Jun 2006 20:20:48 -0000 @@ -42,7 +42,12 @@ 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 Index: scm/define-music-display-methods.scm =================================================================== RCS file: /sources/lilypond/lilypond/scm/define-music-display-methods.scm,v retrieving revision 1.10 diff -u -r1.10 define-music-display-methods.scm --- scm/define-music-display-methods.scm 24 May 2006 13:18:13 -0000 1.10 +++ scm/define-music-display-methods.scm 27 Jun 2006 20:20:55 -0000 @@ -481,11 +481,14 @@ ;; 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 @@ (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) Index: scm/define-music-properties.scm =================================================================== RCS file: /sources/lilypond/lilypond/scm/define-music-properties.scm,v retrieving revision 1.54 diff -u -r1.54 define-music-properties.scm --- scm/define-music-properties.scm 6 Jun 2006 21:48:15 -0000 1.54 +++ scm/define-music-properties.scm 27 Jun 2006 20:20:57 -0000 @@ -50,6 +50,7 @@ (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. ") Index: scm/define-music-types.scm =================================================================== RCS file: /sources/lilypond/lilypond/scm/define-music-types.scm,v retrieving revision 1.81 diff -u -r1.81 define-music-types.scm --- scm/define-music-types.scm 5 Jun 2006 13:57:05 -0000 1.81 +++ scm/define-music-types.scm 27 Jun 2006 20:20:59 -0000 @@ -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 @@ 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 address@hidden for 4 measures in 3/4 time. Note the capital R.") - (types . (general-music event rhythmic-event multi-measure-rest-event)) address@hidden 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 @@ (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)) )) Index: scm/ly-syntax-constructors.scm =================================================================== RCS file: /sources/lilypond/lilypond/scm/ly-syntax-constructors.scm,v retrieving revision 1.2 diff -u -r1.2 ly-syntax-constructors.scm --- scm/ly-syntax-constructors.scm 13 Jun 2006 22:01:19 -0000 1.2 +++ scm/ly-syntax-constructors.scm 27 Jun 2006 20:20:59 -0000 @@ -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))) Index: scm/music-functions.scm =================================================================== RCS file: /sources/lilypond/lilypond/scm/music-functions.scm,v retrieving revision 1.171 diff -u -r1.171 music-functions.scm --- scm/music-functions.scm 17 Jun 2006 23:03:12 -0000 1.171 +++ scm/music-functions.scm 27 Jun 2006 20:21:03 -0000 @@ -387,54 +387,9 @@ ;; 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 @@ (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)