]> git.donarmstrong.com Git - lilypond.git/commitdiff
* lily/sequential-iterator.cc: Change the default get_music_list
authorErik Sandberg <mandolaerik@gmail.com>
Mon, 3 Jul 2006 22:27:00 +0000 (22:27 +0000)
committerErik Sandberg <mandolaerik@gmail.com>
Mon, 3 Jul 2006 22:27:00 +0000 (22:27 +0000)
        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
lily/include/sequential-music-iterator.hh [deleted file]
lily/sequential-iterator.cc
lily/sequential-music-iterator.cc [deleted file]
scm/define-music-display-methods.scm
scm/define-music-properties.scm
scm/define-music-types.scm
scm/ly-syntax-constructors.scm
scm/music-functions.scm

index cc751a7e28103ed75ceb73fe7411bea3d9ba1c6b..28f0389bebd37e657b80e43dd017f4f3e5758052 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,14 @@
+2006-07-03  Erik Sandberg  <mandolaerik@gmail.com>
+
+       * 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  <gpermus@gmail.com>
 
        * 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 (file)
index a70d7bc..0000000
+++ /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 <hanwen@xs4all.nl>
-*/
-
-#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
index 214d1c2e676697ce5e3c0984035f6d7281d0260e..db8eb5865e06c3a838745593cbe2bbc4908918a0 100644 (file)
@@ -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 (file)
index f933df7..0000000
+++ /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 <hanwen@xs4all.nl>
-*/
-
-#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");
-}
index ad1dbf3de7a236fc485044f4fc70bbf70480d7cc..2dbb0acb02200a3a516e0e023973751d012e1e5b 100644 (file)
@@ -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)
index a681f2b6c39a0f432b1554e1276228c07adc000d..9bf878ed6ac082107543e29f1b606b9c9197ce5e 100644 (file)
@@ -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. ")
index fe31b3d40f2177fd9371495cbdb4760965e1c912..bf8da68d31d2918b1b8864f9b238bedd166e5fd6 100644 (file)
@@ -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))
        ))
 
index cd4a0f9374112a06a71d47ac106c6e3b77bc3cf5..44ab47e03c88bb9f1bd8c4542f78cbd683ed6edf 100644 (file)
 (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 e33e1629aff9efd16c7e9a1c9d4bfc7fc3ca65bd..e20e0bef35c5e9e55684b13815daa6da44cdef71 100644 (file)
@@ -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)