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
lilypond-devel@gnu.org
http://lists.gnu.org/mailman/listinfo/lilypond-devel

Reply via email to