]> git.donarmstrong.com Git - lilypond.git/blobdiff - scm/music-functions.scm
* lily/parser.yy (simple_string): allow \new STRING_IDENTIFIER.
[lilypond.git] / scm / music-functions.scm
index 2f1b509de2bec25c55b224f0436d582f1cf6b3a1..2fe0bc373a8bee6feac641d30e68aa369c9c9315 100644 (file)
@@ -96,11 +96,11 @@ For instance,
       (symbol->keyword (string->symbol (substring cmd-markup 0 (- (string-length cmd-markup)
                                                                  (string-length "-markup")))))))
   (define (transform-arg arg)
-    (cond ((and (pair? arg) (pair? (car arg))) ;; a markup list
+    (cond ((and (pair? arg) (markup? (car arg))) ;; a markup list
           (apply append (map inner-markup->make-markup arg)))
-         ((pair? arg)                         ;; a markup
+         ((and (not (string? arg)) (markup? arg)) ;; a markup
           (inner-markup->make-markup arg))
-         (else                                ;; scheme arg
+         (else                                  ;; scheme arg
           arg)))
   (define (inner-markup->make-markup mrkup)
     (let ((cmd (proc->command-keyword (car mrkup)))
@@ -121,17 +121,16 @@ that is, for a music expression, a (make-music ...) form."
         (ly:music? obj)
         `(make-music 
           ',(ly:music-property obj 'name)
-          ,@(append (map (lambda (prop)
-                           (list
-                            (car prop)
-                            (if (and (not (markup? (cdr prop)))
-                                     (list? (cdr prop))
-                                     (pair? (cdr prop))) ;; property is a non-empty list
-                                `(list ,@(map music->make-music (cdr prop)))
-                                (music->make-music (cdr prop)))))
-                         (remove (lambda (prop)
-                                   (eqv? (car prop) 'origin))
-                                 (ly:music-mutable-properties obj))))))
+          ,@(apply append (map (lambda (prop)
+                                  `(',(car prop)
+                                    ,(if (and (not (markup? (cdr prop)))
+                                              (list? (cdr prop))
+                                              (pair? (cdr prop))) ;; property is a non-empty list
+                                         `(list ,@(map music->make-music (cdr prop)))
+                                         (music->make-music (cdr prop)))))
+                                (remove (lambda (prop)
+                                          (eqv? (car prop) 'origin))
+                                        (ly:music-mutable-properties obj))))))
        (;; moment
         (ly:moment? obj)
         `(ly:make-moment ,(ly:moment-main-numerator obj)
@@ -214,14 +213,20 @@ Returns `obj'.
 (define-public (unfold-repeats music)
   "
 This function replaces all repeats  with unfold repeats. "
-  
+
   (let ((es (ly:music-property music 'elements))
        (e  (ly:music-property music 'element))
        )
     (if (memq 'repeated-music (ly:music-property music 'types))
-       (begin
-         (if (equal? (ly:music-property music 'iterator-ctor)
-                     Chord_tremolo_iterator::constructor)
+       (let*
+           ((props (ly:music-mutable-properties music))
+            (old-name (ly:music-property music 'name))
+            (flattened  (flatten-alist props)))
+
+         (set! music (apply make-music (cons 'UnfoldedRepeatedMusic
+                                             flattened)))
+
+         (if (equal? old-name 'TremoloRepeatedMusic)
              (let* ((seq-arg? (memq 'sequential-music
                                     (ly:music-property e 'types)))
                     (count  (ly:music-property music 'repeat-count))
@@ -235,14 +240,9 @@ This function replaces all repeats  with unfold repeats. "
                                             (ly:intlog2 count)) dot-shift)
                
                (if seq-arg?
-                   (ly:music-compress e (ly:make-moment (length (ly:music-property e 'elements)) 1)))))
+                   (ly:music-compress e (ly:make-moment (length (ly:music-property
+                                                                 e 'elements)) 1)))))))
          
-         (set! (ly:music-property music 'length-callback)
-               Repeated_music::unfolded_music_length)
-         (set! (ly:music-property music 'start-callback)
-               Repeated_music::first_start)
-         (set! (ly:music-property music 'iterator-ctor)
-               Unfolded_repeat_iterator::constructor)))
     
     (if (pair? es)
        (set! (ly:music-property music 'elements)
@@ -504,8 +504,7 @@ of beat groupings "
 (define-public (voicify-music m)
   "Recursively split chords that are separated with \\ "
   (if (not (ly:music? m))
-      (begin (display m)
-            (error "not music!")))
+      (ly:error (_ "music expected: ~S") m))
   (let ((es (ly:music-property m 'elements))
        (e (ly:music-property m 'element)))
 
@@ -554,9 +553,10 @@ of beat groupings "
       (let* ((bn (ly:context-property tr 'currentBarNumber)))
        (if (= bn n)
            #t
-           (error
-            (format "Bar check failed, we should have reached ~a, instead at ~a\n"
-                    n bn)))))
+           (ly:error
+            ;; FIXME: uncomprehensable message
+            (_ "Bar check failed.  Expect to be at ~a, instead at ~a")
+            n bn))))
     (set! (ly:music-property m 'procedure) checker)
     m))
 
@@ -573,7 +573,7 @@ of beat groupings "
   (let ((ip (ly:music-property music 'origin)))
     (if (ly:input-location? ip)
        (ly:input-message ip msg)
-       (ly:warn msg))))
+       (ly:warning msg))))
 
 (define (check-start-chords music)
   "Check music expression for a Simultaneous_music containing notes\n(ie. Request_chords),
@@ -699,8 +699,7 @@ Syntax:
     (if (string? quoted-name)
        (if  (vector? quoted-vector)
             (set! (ly:music-property music 'quoted-events) quoted-vector)
-            (ly:warn "Cannot find quoted music `~S'" quoted-name)))
-
+            (ly:warning (_ "can't find quoted music `~S'" quoted-name))))
     music))
 
 
@@ -733,6 +732,39 @@ Syntax:
        (ly:music-length music))
   music)
 
+(define (skip-to-last music parser)
+
+  "Replace MUSIC by
+
+<< { \\set skipTypesetting = ##t
+     LENGTHOF(\\showLastLength)
+     \\set skipTypesetting = ##t  }
+    MUSIC >>
+
+if appropriate.
+ "
+  (let*
+      ((show-last  (ly:parser-lookup parser 'showLastLength)))
+    
+    (if (ly:music? show-last)
+       (let*
+           ((orig-length (ly:music-length music))
+            (skip-length (ly:moment-sub orig-length (ly:music-length show-last))))
+
+         (make-simultaneous-music
+          (list
+           (make-sequential-music
+            (list
+             (context-spec-music (make-property-set 'skipTypesetting #t) 'Score)
+             (make-music 'SkipMusic 'duration
+                         (ly:make-duration 0 0
+                                           (ly:moment-main-numerator skip-length)
+                                           (ly:moment-main-denominator skip-length)))
+             (context-spec-music (make-property-set 'skipTypesetting #f) 'Score)))
+           music)))
+       music)))
+    
+
 (define-public toplevel-music-functions
   (list
    (lambda (music parser) (voicify-music music))
@@ -745,9 +777,10 @@ Syntax:
    
    ;; switch-on-debugging
    (lambda (x parser) (music-map cue-substitute x))
-;   (lambda (x parser) (music-map display-scheme-music x))
-
-   ))
+   (lambda (x parser)
+     (skip-to-last x parser)
+   )))
 
 ;;;;;;;;;;;;;;;;;
 ;; lyrics
@@ -873,7 +906,7 @@ use GrandStaff as a context. "
                                   '()
                                   context))
       (else
-       (ly:warn "Unknown accidental style: ~S" (symbol->string style))
+       (ly:warning (_ "unknown accidental style: ~S" style))
        (make-sequential-music '()))))))
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;