On Tuesday 27 June 2006 13:08, Han-Wen Nienhuys wrote:
> Erik Sandberg schreef:
> > The attached patch makes my proposed change to sequential-iterators, and
> > uses this to clean up multi measure rests. The patch obsoletes the
> > following: - glue-mm-rests
> > - MultiMeasureRestMusicGroup
> > - Sequential_music_iterator
> >
> > I know mm rests can be further cleaned up by creating spanner events, but
> > I won't do that this time (IIRC you want to do some related cleanups of
> > mm rests, and I want to avoid double work)
>
> looks good, but you will need to fix up .ly displayLilyMusic too, I think.
OK.
Han-Wen/Jan: The attached patch also removes the old multi-measure rest
mechanism. I'll remove sequential-music-iterator.cc also if I commit.
Nicolas: Does the music display method look OK? (also I think I spotted a
harmless typo; correct me if I'm wrong)
I used the following to test; it works fine, as does the regression tests.
\version "2.9.10"
\displayLilyMusic {
c1 e
R1^"foo"
R1-\fermataMarkup
R1*2\p
{ d1 e }
}
--
Erik
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
[EMAIL PROTECTED] for 4 measures in 3/4 time. Note the capital R.")
- (types . (general-music event rhythmic-event multi-measure-rest-event))
[EMAIL PROTECTED] 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)
_______________________________________________
lilypond-devel mailing list
[email protected]
http://lists.gnu.org/mailman/listinfo/lilypond-devel