]> git.donarmstrong.com Git - lilypond.git/blobdiff - ly/music-functions-init.ly
Merge branch 'master' into lilypond/translation
[lilypond.git] / ly / music-functions-init.ly
index 8b5cddf013b85acc882b66c15c8be09878375430..59c452065c3a03cc33fda0e489908c5f15faff69 100644 (file)
@@ -2,7 +2,7 @@
 
 %%%% This file is part of LilyPond, the GNU music typesetter.
 %%%%
-%%%% Copyright (C) 2003--2011 Han-Wen Nienhuys <hanwen@xs4all.nl>
+%%%% Copyright (C) 2003--2012 Han-Wen Nienhuys <hanwen@xs4all.nl>
 %%%%                          Jan Nieuwenhuizen <janneke@gnu.org>
 %%%%
 %%%% LilyPond is free software: you can redistribute it and/or modify
@@ -293,13 +293,11 @@ endSpanners =
 #(define-music-function (parser location music) (ly:music?)
    (_i "Terminate the next spanner prematurely after exactly one note
 without the need of a specific end spanner.")
-   (if (eq? (ly:music-property music 'name) 'EventChord)
-       (let* ((elts (ly:music-property music 'elements))
-             (start-span-evs (filter (lambda (ev)
-                                       (and (music-has-type ev 'span-event)
-                                            (equal? (ly:music-property ev 'span-direction)
-                                                    START)))
-                                     elts))
+   (if (memq (ly:music-property music 'name) '(EventChord NoteEvent))
+       (let* ((start-span-evs (filter (lambda (ev)
+                                       (equal? (ly:music-property ev 'span-direction)
+                                               START))
+                                     (extract-typed-music music 'span-event)))
              (stop-span-evs
               (map (lambda (m)
                      (let ((c (music-clone m)))
@@ -314,7 +312,7 @@ without the need of a specific end spanner.")
         total)
 
        (begin
-        (ly:input-message location (_ "argument endSpanners is not an EventChord: ~a" music))
+        (ly:input-message location (_ "argument endSpanners is not an EventChord: ~a") music)
         music)))
 
 
@@ -325,78 +323,37 @@ featherDurations=
    (let ((orig-duration (ly:music-length argument))
         (multiplier (ly:make-moment 1 1)))
 
-     (music-map
+     (for-each
       (lambda (mus)
-       (if (and (eq? (ly:music-property mus 'name) 'EventChord)
-                (< 0 (ly:moment-main-denominator (ly:music-length mus))))
+       (if (< 0 (ly:moment-main-denominator (ly:music-length mus)))
            (begin
              (ly:music-compress mus multiplier)
-             (set! multiplier (ly:moment-mul factor multiplier))))
-       mus)
-      argument)
-
+             (set! multiplier (ly:moment-mul factor multiplier)))))
+      (extract-named-music argument '(EventChord NoteEvent RestEvent SkipEvent)))
      (ly:music-compress
       argument
       (ly:moment-div orig-duration (ly:music-length argument)))
 
      argument))
 
-footnoteGrob =
-#(define-music-function (parser location grob-name offset text footnote)
-   (symbol? number-pair? markup? markup?)
-   (_i "Attach @var{text} to @var{grob-name} at offset @var{offset},
-with @var{text} referring to @var{footnote} (use like @code{\\once})")
-   (make-music 'FootnoteEvent
-               'automatically-numbered #f
-              'symbol grob-name
-              'X-offset (car offset)
-              'Y-offset (cdr offset)
-              'text text
-              'footnote-text footnote))
-
-autoFootnoteGrob =
-#(define-music-function (parser location grob-name offset footnote)
-   (symbol? number-pair? markup?)
-   (_i "Footnote @var{grob-name} with the text in @var{footnote}
-allowing for the footnote to be automatically numbered such that
-the number appears at @var{offset}.  Note that, for this to take effect,
-auto-numbering must be turned on in the paper block.  Otherwise, no
-number will appear.  Use like @code{\\once})")
-   (make-music 'FootnoteEvent
-               'automatically-numbered #t
-              'symbol grob-name
-              'X-offset (car offset)
-              'Y-offset (cdr offset)
-               'text (make-null-markup)
-              'footnote-text footnote))
-
-
 footnote =
-#(define-music-function (parser location offset text footnote)
-   (number-pair? markup? markup?)
-   (_i "Attach @var{text} at @var{offset} with @var{text} referring
-to @var{footnote} (use like @code{\\tweak})")
-   (make-music 'FootnoteEvent
-               'automatically-numbered #f
-              'X-offset (car offset)
-              'Y-offset (cdr offset)
-              'text text
-              'footnote-text footnote))
-
-autoFootnote =
-#(define-music-function (parser location offset footnote)
-   (number-pair? markup?)
-   (_i "Footnote the item after which this comes with the text in
-@var{footnote} allowing for the footnote to be automatically numbered
-such that the number appears at @var{offset}.  Note that, for this to
-take effect, auto-numbering must be turned on in the paper block.
-Otherwise, no number will appear.  Use like @code{\\tweak})")
-   (make-music 'FootnoteEvent
-               'automatically-numbered #t
-              'X-offset (car offset)
-              'Y-offset (cdr offset)
-              'text (make-null-markup)
-              'footnote-text footnote))
+#(define-music-function (parser location text offset grob-name footnote)
+   ((markup?) number-pair? (symbol? '()) markup?)
+   (_i "Attach @var{text} at @var{offset} with @var{text} referring to
+@var{footnote}.  If @var{text} is given as @code{\\default}, use
+autonumbering instead.  Note that, for this to take effect,
+auto-numbering must be turned on in the paper block.  Otherwise, no
+number will appear.  Footnotes are applied like articulations.  If a
+symbol @var{grob-name} is specified, all grobs of that kind at the
+current time step are affected.")
+   (make-music
+    'FootnoteEvent
+    'X-offset (car offset)
+    'Y-offset (cdr offset)
+    'automatically-numbered (not text)
+    'text (or text (make-null-markup))
+    'footnote-text footnote
+    'symbol grob-name))
 
 grace =
 #(def-grace-function startGraceMusic stopGraceMusic
@@ -763,10 +720,16 @@ Example:
                         (and (not (null? origins)) (car origins)))))))
      ;;
      ;; first, split the music and fill in voices
-     (for-each (lambda (m)
-                    (push-music m)
-                    (if (bar-check? m) (change-voice)))
-                  (ly:music-property music 'elements))
+     ;; We flatten direct layers of SequentialMusic since they are
+     ;; pretty much impossible to avoid when writing music functions.
+     (let rec ((music music))
+       (for-each (lambda (m)
+                  (if (eq? (ly:music-property m 'name) 'SequentialMusic)
+                      (rec m)
+                      (begin
+                        (push-music m)
+                        (if (bar-check? m) (change-voice)))))
+                (ly:music-property music 'elements)))
      (if (not (null? current-sequence)) (change-voice))
      ;; un-circularize `voices' and reorder the voices
      (set! voices (map-in-order (lambda (dummy seqs)
@@ -878,13 +841,9 @@ pitchedTrill =
    (_i "Print a trill with @var{main-note} as the main note of the trill and
 print @var{secondary-note} as a stemless note head in parentheses.")
    (let* ((get-notes (lambda (ev-chord)
-                       (filter
-                        (lambda (m) (eq? 'NoteEvent (ly:music-property m 'name)))
-                        (ly:music-property ev-chord 'elements))))
+                      (extract-named-music ev-chord 'NoteEvent)))
           (sec-note-events (get-notes secondary-note))
-          (trill-events (filter (lambda (m) (music-has-type m 'trill-span-event))
-                                (ly:music-property main-note 'elements))))
-
+          (trill-events (extract-named-music main-note 'TrillSpanEvent)))
      (if (pair? sec-note-events)
          (begin
            (let* ((trill-pitch (ly:music-property (car sec-note-events) 'pitch))
@@ -1024,7 +983,8 @@ a context modification duplicating their effect.")
 shiftDurations =
 #(define-music-function (parser location dur dots arg)
    (integer? integer? ly:music?)
-   (_i "Scale @var{arg} up by a factor of 2^@var{dur}*(2-(1/2)^@var{dots}).")
+   (_i "Change the duration of @var{arg} by adding @var{dur} to the
+@code{durlog} of @var{arg} and @var{dots} to the @code{dots} of @var{arg}.")
 
    (music-map
     (lambda (x)