]> git.donarmstrong.com Git - lilypond.git/commitdiff
Issue 4488/2: Use ly:set-origin! and two-argument form of ly:music-deep-copy
authorDavid Kastrup <dak@gnu.org>
Fri, 10 Jul 2015 09:00:36 +0000 (11:00 +0200)
committerDavid Kastrup <dak@gnu.org>
Sat, 18 Jul 2015 04:42:12 +0000 (06:42 +0200)
ly/music-functions-init.ly
scm/define-music-callbacks.scm
scm/ly-syntax-constructors.scm
scm/music-functions.scm

index 6e0f5b5651951cd24238550b250af752ed13fdcc..ea20f1f755a573d1e93fb0967941f8f774115aa5 100644 (file)
@@ -1163,18 +1163,17 @@ change to the following voice."
        (and (or split-elt split-elts)
             (map
              (lambda (e es)
-               (apply music-clone music
-                      (append
-                       ;; reassigning the origin of the parent only
-                       ;; makes sense if the first expression in the
-                       ;; result is from a distributed origin
-                       (let ((origin
-                              (if (ly:music? elt)
-                                  (and (ly:music? e) (ly:music-property e 'origin #f))
-                                  (and (pair? es) (ly:music-property (car es) 'origin #f)))))
-                         (if origin (list 'origin origin) '()))
-                       (if (ly:music? e) (list 'element e) '())
-                       (if (pair? es) (list 'elements es) '()))))
+               (let ((m (ly:music-deep-copy music
+                       ;;; reassigning the origin of the parent only
+                       ;;; makes sense if the first expression in the
+                       ;;; result is from a distributed origin
+                                            (or (and (ly:music? e) e)
+                                                (and (pair? es) (car es))))))
+                 (if (ly:music? e)
+                     (set! (ly:music-property m 'element) e))
+                 (if (pair? es)
+                     (set! (ly:music-property m 'elements) es))
+                 m))
              (or split-elt (circular-list #f))
              (or split-elts (circular-list #f))))))
    (let ((voices (recurse-and-split music)))
index f2d89ae71fd4cd9560b4ed232f0fccff6d9b8002..5cc1db14cd7b12fd22ebc664fe18b5ea1f9ae1c4 100644 (file)
 (define (mm-rest-child-list music)
   "Generate events for multimeasure rests,
 to be used by the sequential-iterator"
-  (let ((location (ly:music-property music 'location)))
-    (list (make-music 'BarCheck
-                      'origin location)
-          (make-music 'MultiMeasureRestEvent
-                      (ly:music-deep-copy music))
-          (make-music 'BarCheck
-                      'origin location))))
+  (ly:set-origin! (list (make-music 'BarCheck)
+                        (make-music 'MultiMeasureRestEvent
+                                    (ly:music-deep-copy music))
+                        (make-music 'BarCheck))
+                  music))
 
 (define (make-unfolded-set music)
   (let ((n (ly:music-property music 'repeat-count))
index c595755e5a96c7628196c8f584f03f69f3de7a47..be8da275d8d2ea09821c658a24b183e19a0e5638 100644 (file)
   #:use-module (lily)
   #:use-module (srfi srfi-1))
 
-;; Sets music origin to (*location*)
-(define (here! m)
-  (set! (ly:music-property m 'origin) (*location*))
-  m)
-
 (define-public (music-function-call-error fun m)
   (let* ((sig (ly:music-function-signature fun))
          (pred (if (pair? (car sig)) (caar sig) (car sig))))
@@ -48,7 +43,7 @@
          (m (and good (apply (ly:music-function-extract fun)
                              (reverse! args rest)))))
     (if (and good (pred m))
-        (if (ly:music? m) (here! m) m)
+        (if (ly:music? m) (ly:set-origin! m) m)
         (if good
             (music-function-call-error fun m)
             (and (pair? (car sig)) (cdar sig))))))
    (*location*)))
 
 (define-public (void-music)
-  (here! (make-music 'Music)))
+  (ly:set-origin! (make-music 'Music)))
 
 (define-public (sequential-music mlist)
-  (here! (make-sequential-music mlist)))
+  (ly:set-origin! (make-sequential-music mlist)))
 
 (define-public (simultaneous-music mlist)
-  (here! (make-simultaneous-music mlist)))
+  (ly:set-origin! (make-simultaneous-music mlist)))
 
 (define-public (event-chord mlist)
-  (here! (make-music 'EventChord
-                     'elements mlist)))
+  (ly:set-origin! (make-music 'EventChord
+                              'elements mlist)))
 
 (define-public (unrelativable-music mus)
-  (here! (make-music 'UnrelativableMusic
-                     'element mus)))
+  (ly:set-origin! (make-music 'UnrelativableMusic
+                              'element mus)))
 
 (define-public (context-change type id)
-  (here! (make-music 'ContextChange
-                     'change-to-type type
-                     'change-to-id id)))
+  (ly:set-origin! (make-music 'ContextChange
+                              'change-to-type type
+                              'change-to-id id)))
 
 (define-public (tempo text . rest)
   (let* ((unit (and (pair? rest)
          (count (and unit
                      (cadr rest)))
          (range-tempo? (pair? count))
-         (tempo-change (here! (make-music 'TempoChangeEvent
-                                          'text text
-                                          'tempo-unit unit
-                                          'metronome-count count)))
+         (tempo-change (ly:set-origin! (make-music 'TempoChangeEvent
+                                                   'text text
+                                                   'tempo-unit unit
+                                                   'metronome-count count)))
          (tempo-set
           (and unit
                (context-spec-music
         tempo-change)))
 
 (define-public (repeat type num body alts)
-  (here! (make-repeat type num body alts)))
+  (ly:set-origin! (make-repeat type num body alts)))
 
 (define (script-to-mmrest-text music)
   "Extract @code{'direction} and @code{'text} from @var{music}, and transform
@@ -122,20 +117,20 @@ into a @code{MultiMeasureTextEvent}."
       music))
 
 (define-public (multi-measure-rest duration articulations)
-  (here! (make-music 'MultiMeasureRestMusic
-                     'articulations (map script-to-mmrest-text articulations)
-                     'duration duration)))
+  (ly:set-origin! (make-music 'MultiMeasureRestMusic
+                              'articulations (map script-to-mmrest-text articulations)
+                              'duration duration)))
 
 (define-public (repetition-chord duration articulations)
-  (here! (make-music 'EventChord
-                     'duration duration
-                     'elements articulations)))
+  (ly:set-origin! (make-music 'EventChord
+                              'duration duration
+                              'elements articulations)))
 
 (define-public (context-specification type id ops create-new mus)
   (let ((csm (context-spec-music mus type id)))
     (set! (ly:music-property csm 'property-operations) ops)
     (if create-new (set! (ly:music-property csm 'create-new) #t))
-    (here! csm)))
+    (ly:set-origin! csm)))
 
 (define-public (composed-markup-list commands markups)
   ;; `markups' being a list of markups, eg (markup1 markup2 markup3),
@@ -178,12 +173,12 @@ into a @code{MultiMeasureTextEvent}."
                        (list 'grob-property-path (car args))
                        (list 'grob-property-path args)))
                   (else (ly:error (_ "Invalid property operation ~a") music-type))))
-         (m (here! (apply make-music music-type
-                          'symbol symbol
-                          props))))
-    (here! (make-music 'ContextSpeccedMusic
-                       'element m
-                       'context-type ctx))))
+         (m (ly:set-origin! (apply make-music music-type
+                                   'symbol symbol
+                                   props))))
+    (ly:set-origin! (make-music 'ContextSpeccedMusic
+                                'element m
+                                'context-type ctx))))
 
 (define (get-first-context-id! mus)
   "Find the name of a ContextSpeccedMusic, possibly naming it"
@@ -202,7 +197,7 @@ into a @code{MultiMeasureTextEvent}."
         '())))
 
 (define-public (lyric-event text duration)
-  (here! (make-lyric-event text duration)))
+  (ly:set-origin! (make-lyric-event text duration)))
 
 (define-public (lyric-combine sync sync-type music)
   ;; CompletizeExtenderEvent is added following the last lyric in MUSIC
@@ -210,7 +205,7 @@ into a @code{MultiMeasureTextEvent}."
   ;; be completed if the lyrics end before the associated voice.
   (append! (ly:music-property music 'elements)
            (list (make-music 'CompletizeExtenderEvent)))
-  (here!
+  (ly:set-origin!
    (make-music 'LyricCombineMusic
                'element music
                'associated-context sync
@@ -233,11 +228,11 @@ into a @code{MultiMeasureTextEvent}."
                      (lambda (mus)
                        (with-location
                         (ly:music-property mus 'origin)
-                        (here! (make-music 'ContextSpeccedMusic
-                                           'create-new #t
-                                           'context-type 'Lyrics
-                                           'element
-                                           (lyric-combine
-                                            voice-name voice-type mus)))))
+                        (ly:set-origin! (make-music 'ContextSpeccedMusic
+                                                    'create-new #t
+                                                    'context-type 'Lyrics
+                                                    'element
+                                                    (lyric-combine
+                                                     voice-name voice-type mus)))))
                      addlyrics-list)))
     (make-simultaneous-music (cons voice lyricstos))))
index 75e6da5349077ef08cb64f9d83665a88f4af6fae..b75709bf0c733c56ba283d3a016694cf5cddde3a 100644 (file)
@@ -718,11 +718,6 @@ duration is replaced with the specified @var{duration}."
   (define (keep-element? m)
     (any (lambda (t) (music-is-of-type? m t))
          event-types))
-  (define origin (ly:music-property repeat-chord 'origin #f))
-  (define (set-origin! l)
-    (if origin
-        (for-each (lambda (m) (set! (ly:music-property m 'origin) origin)) l))
-    l)
 
   (for-each
    (lambda (field)
@@ -736,16 +731,17 @@ duration is replaced with the specified @var{duration}."
   ;; now treat the elements
   (set! (ly:music-property repeat-chord 'elements)
         (let ((elts
-               (set-origin! (ly:music-deep-copy
-                             (filter keep-element?
-                                     (ly:music-property original-chord
-                                                        'elements))))))
+               (ly:music-deep-copy (filter keep-element?
+                                           (ly:music-property original-chord
+                                                              'elements))
+                                   repeat-chord)))
           (for-each
            (lambda (m)
              (let ((arts (ly:music-property m 'articulations)))
                (if (pair? arts)
                    (set! (ly:music-property m 'articulations)
-                         (set-origin! (filter! keep-element? arts))))
+                         (ly:set-origin! (filter! keep-element? arts)
+                                         repeat-chord)))
                (if (ly:duration? (ly:music-property m 'duration))
                    (set! (ly:music-property m 'duration) duration))
                (if (ly:music-property m 'cautionary #f)
@@ -760,7 +756,7 @@ duration is replaced with the specified @var{duration}."
     (if (pair? arts)
         (set! (ly:music-property repeat-chord 'articulations)
               (append!
-               (set-origin! (ly:music-deep-copy arts))
+               (ly:music-deep-copy arts repeat-chord)
                (ly:music-property repeat-chord 'articulations)))))
   repeat-chord)