]> git.donarmstrong.com Git - lilypond.git/blobdiff - ly/music-functions-init.ly
Run grand replace for 2015.
[lilypond.git] / ly / music-functions-init.ly
index 78a6b236c4c7861ed53b5af45b83a81cda3a8582..7d9f5b7034b2fcf8011e02b8d997d0a9746cf5e1 100644 (file)
@@ -2,7 +2,7 @@
 
 %%%% This file is part of LilyPond, the GNU music typesetter.
 %%%%
-%%%% Copyright (C) 2003--2014 Han-Wen Nienhuys <hanwen@xs4all.nl>
+%%%% Copyright (C) 2003--2015 Han-Wen Nienhuys <hanwen@xs4all.nl>
 %%%%                          Jan Nieuwenhuizen <janneke@gnu.org>
 %%%%
 %%%% LilyPond is free software: you can redistribute it and/or modify
@@ -253,15 +253,7 @@ bookOutputSuffix =
 breathe =
 #(define-music-function (parser location) ()
    (_i "Insert a breath mark.")
-   (make-music 'BreathingEvent
-     'midi-length
-     (lambda (len context)
-       ;;Shorten by half, or by up to a second, but always by a power of 2
-       (let* ((desired (min (ly:moment-main (seconds->moment 1 context))
-                            (* (ly:moment-main len) 1/2)))
-              (scale (inexact->exact (ceiling (/ (log desired) (log 1/2)))))
-              (breath (ly:make-moment (expt 1/2 scale))))
-         (ly:moment-sub (ly:make-moment (ly:moment-main len)) breath)))))
+   (make-music 'BreathingEvent))
 
 clef =
 #(define-music-function (parser location type) (string?)
@@ -287,7 +279,7 @@ as @code{\\compoundMeter #'((3 2 8))} or shorter
                         (ly:moment-main-denominator mlen))))
   #{
     \once \override Timing.TimeSignature.stencil = #(lambda (grob)
-      (grob-interpret-markup grob (format-compound-time args)))
+      (grob-interpret-markup grob (make-compound-meter-markup args)))
     \set Timing.timeSignatureFraction = #timesig
     \set Timing.baseMoment = #beat
     \set Timing.beatStructure = #beatGrouping
@@ -467,8 +459,8 @@ grobdescriptions =
 in the format of @code{all-grob-descriptions}.")
    (ly:make-context-mod
     (map (lambda (p)
-          (list 'assign (car p) (list (cdr p))))
-        descriptions)))
+          (list 'assign (car p) (ly:make-grob-properties (cdr p))))
+         descriptions)))
 
 harmonicByFret = #(define-music-function (parser location fret music) (number? ly:music?)
   (_i "Convert @var{music} into mixed harmonics; the resulting notes resemble
@@ -554,21 +546,18 @@ instrumentSwitch =
 
 
 keepWithTag =
-#(define-music-function (parser location tag music)
+#(define-music-function (parser location tags music)
    (symbol-list-or-symbol? ly:music?)
-   (_i "Include only elements of @var{music} that are either untagged
-or tagged with one of the tags in @var{tag}.  @var{tag} may be either
-a single symbol or a list of symbols.")
+   (_i "Include only elements of @var{music} that are tagged with one
+of the tags in @var{tags}.  @var{tags} may be either a single symbol
+or a list of symbols.
+
+Each tag may be declared as a member of at most one tag group (defined
+with @code{\\tagGroup}).  If none of a @var{music} element's tags
+share a tag group with one of the specified @var{tags}, the element is
+retained.")
    (music-filter
-    (if (symbol? tag)
-        (lambda (m)
-          (let ((music-tags (ly:music-property m 'tags)))
-            (or (null? music-tags)
-                (memq tag music-tags))))
-        (lambda (m)
-          (let ((music-tags (ly:music-property m 'tags)))
-            (or (null? music-tags)
-                (any (lambda (t) (memq t music-tags)) tag)))))
+    (tags-keep-predicate tags)
     music))
 
 key =
@@ -642,86 +631,56 @@ slurs, ties, and horizontal spacing are adjusted automatically.")
    (define unshrinkable-props
      '(
        ;; stems
-       Stem.thickness
+       (Stem thickness)
+
        ;; slurs
-       Slur.line-thickness
-       Slur.thickness
-       PhrasingSlur.line-thickness
-       PhrasingSlur.thickness
+       (Slur line-thickness)
+       (Slur thickness)
+       (PhrasingSlur line-thickness)
+       (PhrasingSlur thickness)
+
        ;; ties
-       Tie.line-thickness
-       Tie.thickness
-       LaissezVibrerTie.line-thickness
-       LaissezVibrerTie.thickness
-       RepeatTie.line-thickness
-       RepeatTie.thickness
+       (Tie line-thickness)
+       (Tie thickness)
+       (LaissezVibrerTie line-thickness)
+       (LaissezVibrerTie thickness)
+       (RepeatTie line-thickness)
+       (RepeatTie thickness)
        ))
 
    ;; these props ARE allowed to shrink below default size
    (define shrinkable-props
-     '(
-       ;; TODO: uncomment spacing-increment here once Issue 3987 is fixed
-       ;; override at the 'Score level
-       ;SpacingSpanner.spacing-increment
-
-       ;; Beam.beam-thickness is dealt with separately below
-
-       ;; lengths and heights
-       Beam.length-fraction
-       Stem.length-fraction
-       Stem.beamlet-default-length
-       Slur.height-limit
-       Slur.minimum-length
-       PhrasingSlur.height-limit
-       PhrasingSlur.minimum-length
-
-       ;; every Slur.details prop that's
-       ;; not a factor, penalty, ratio, or slope
-       Slur.details.region-size
-       Slur.details.free-head-distance
-       Slur.details.free-slur-distance
-       Slur.details.gap-to-staffline-inside
-       Slur.details.gap-to-staffline-outside
-       Slur.details.extra-encompass-free-distance
-       Slur.details.extra-encompass-collision-distance
-       Slur.details.close-to-edge-length
-       Slur.details.encompass-object-range-overshoot
-       Slur.details.slur-tie-extrema-min-distance
-
-       ;; every PhrasingSlur.details prop that's
-       ;; not a factor, penalty, ratio, or slope
-       PhrasingSlur.details.region-size
-       PhrasingSlur.details.free-head-distance
-       PhrasingSlur.details.free-slur-distance
-       PhrasingSlur.details.gap-to-staffline-inside
-       PhrasingSlur.details.gap-to-staffline-outside
-       PhrasingSlur.details.extra-encompass-free-distance
-       PhrasingSlur.details.extra-encompass-collision-distance
-       PhrasingSlur.details.close-to-edge-length
-       PhrasingSlur.details.encompass-object-range-overshoot
-       PhrasingSlur.details.slur-tie-extrema-min-distance
-
-       ;; every Tie.details prop that's
-       ;; not a factor, penalty, ratio, or slope
-       Tie.details.center-staff-line-clearance
-       Tie.details.tip-staff-line-clearance
-       Tie.details.note-head-gap
-       Tie.details.stem-gap
-       Tie.details.height-limit
-       Tie.details.tie-tie-collision-distance
-       Tie.details.intra-space-threshold
-       Tie.details.outer-tie-vertical-gap
-       Tie.details.multi-tie-region-size
-       Tie.details.single-tie-region-size
-       Tie.details.between-length-limit
-       ))
+     (let ((baseline-skip-props
+             (find-named-props 'baseline-skip all-grob-descriptions))
+           (word-space-props
+             (find-named-props 'word-space all-grob-descriptions)))
+       (append
+         baseline-skip-props
+         word-space-props
+         '(
+           ;; TODO: uncomment spacing-increment here once Issue 3987 is fixed
+           ;; override at the 'Score level
+           ;(SpacingSpanner spacing-increment)
+
+           ;; lengths and heights
+           (Beam length-fraction)
+           (Stem length-fraction)
+           (Stem beamlet-default-length)
+           (Stem double-stem-separation)
+           (Slur height-limit)
+           (Slur minimum-length)
+           (PhrasingSlur height-limit)
+           (PhrasingSlur minimum-length)
+
+           ;; Beam.beam-thickness is dealt with separately below
+           ))))
    #{
-     \context Voice {
+     \context Bottom {
        %% TODO: uncomment \newSpacingSection once Issue 3990 is fixed
        %\newSpacingSection
-       #(scale-fontSize mag)
-       #(scale-props unshrinkable-props mag #f)
-       #(scale-props shrinkable-props   mag #t)
+       #(scale-fontSize 'magnifyMusic mag)
+       #(scale-props    'magnifyMusic mag #f unshrinkable-props)
+       #(scale-props    'magnifyMusic mag #t shrinkable-props)
        #(scale-beam-thickness mag)
 
        #music
@@ -729,13 +688,71 @@ slurs, ties, and horizontal spacing are adjusted automatically.")
        %% TODO: uncomment \newSpacingSection once Issue 3990 is fixed
        %\newSpacingSection
        %% reverse engineer the former fontSize value instead of using \unset
-       #(revert-fontSize mag)
-       #(revert-props (append unshrinkable-props
-                              shrinkable-props
-                              (list 'Beam.beam-thickness)))
+       #(revert-fontSize 'magnifyMusic mag)
+       #(revert-props    'magnifyMusic mag (append unshrinkable-props
+                                                   shrinkable-props
+                                                   '((Beam beam-thickness))))
      }
    #})
 
+magnifyStaff =
+#(define-music-function (parser location mag) (positive?)
+   (_i "Change the size of the staff, adjusting notation size and
+horizontal spacing automatically, using @var{mag} as a size factor.")
+
+   ;; these props are NOT allowed to shrink below default size
+   (define unshrinkable-props
+     '((StaffSymbol thickness)))
+
+   ;; these props ARE allowed to shrink below default size
+   (define shrinkable-props
+     (let* ((baseline-skip-props
+              (find-named-props 'baseline-skip all-grob-descriptions))
+            (word-space-props
+              (find-named-props 'word-space all-grob-descriptions))
+            (space-alist-props
+              (find-named-props 'space-alist all-grob-descriptions)))
+       (append
+         baseline-skip-props
+         word-space-props
+         space-alist-props
+         '(
+           ;; override at the 'Score level
+           (SpacingSpanner spacing-increment)
+
+           (StaffSymbol staff-space)
+           (BarLine kern)
+           (BarLine segno-kern)
+           (BarLine hair-thickness)
+           (BarLine thick-thickness)
+           (Stem beamlet-default-length)
+           (Stem double-stem-separation)
+           ))))
+
+   #{
+     \stopStaff
+
+     %% revert settings from last time
+     %% (but only if \magnifyStaff has already been used
+     %% and the staff magnification is changing)
+     #(revert-fontSize 'magnifyStaff mag)
+     #(revert-props    'magnifyStaff mag (append unshrinkable-props
+                                                 shrinkable-props))
+
+     %% scale settings
+     %% (but only if staff magnification is changing
+     %% and does not equal 1)
+     #(scale-fontSize 'magnifyStaff mag)
+     #(scale-props    'magnifyStaff mag #f unshrinkable-props)
+     #(scale-props    'magnifyStaff mag #t shrinkable-props)
+
+     %% this might cause problems until Issue 3990 is fixed
+     \newSpacingSection
+
+     \startStaff
+     \set Staff.magnifyStaffValue = #mag
+   #})
+
 makeClusters =
 #(define-music-function (parser location arg) (ly:music?)
    (_i "Display chords in @var{arg} as clusters.")
@@ -1107,25 +1124,31 @@ parenthesize =
    arg)
 
 partcombine =
-#(define-music-function (parser location part1 part2) (ly:music? ly:music?)
-   (_i "Take the music in @var{part1} and @var{part2} and typeset so
-that they share a staff.")
+#(define-music-function (parser location chord-range part1 part2)
+   ((number-pair? '(0 . 8)) ly:music? ly:music?)
+   (_i "Take the music in @var{part1} and @var{part2} and return
+a music expression containing simultaneous voices, where @var{part1}
+and @var{part2} are combined into one voice where appropriate.
+Optional @var{chord-range} sets the distance in steps between notes
+that may be combined into a chord or unison.")
    (make-part-combine-music parser
-                            (list part1 part2) #f))
+                            (list part1 part2) #f chord-range))
 
 partcombineUp =
-#(define-music-function (parser location part1 part2) (ly:music? ly:music?)
+#(define-music-function (parser location chord-range part1 part2)
+   ((number-pair? '(0 . 8)) ly:music? ly:music?)
    (_i "Take the music in @var{part1} and @var{part2} and typeset so
 that they share a staff with stems directed upward.")
    (make-part-combine-music parser
-                            (list part1 part2) UP))
+                            (list part1 part2) UP chord-range))
 
 partcombineDown =
-#(define-music-function (parser location part1 part2) (ly:music? ly:music?)
+#(define-music-function (parser location chord-range part1 part2)
+   ((number-pair? '(0 . 8)) ly:music? ly:music?)
    (_i "Take the music in @var{part1} and @var{part2} and typeset so
 that they share a staff with stems directed downward.")
    (make-part-combine-music parser
-                            (list part1 part2) DOWN))
+                            (list part1 part2) DOWN chord-range))
 
 partcombineForce =
 #(define-music-function (location parser type once) (symbol-or-boolean? boolean?)
@@ -1233,19 +1256,13 @@ omitted, the first note in @var{music} is given in absolute pitch.")
               'element music))
 
 removeWithTag =
-#(define-music-function (parser location tag music)
+#(define-music-function (parser location tags music)
    (symbol-list-or-symbol? ly:music?)
    (_i "Remove elements of @var{music} that are tagged with one of the
-tags in @var{tag}.  @var{tag} may be either a single symbol or a list
+tags in @var{tags}.  @var{tags} may be either a single symbol or a list
 of symbols.")
    (music-filter
-    (if (symbol? tag)
-        (lambda (m)
-          (not (memq tag (ly:music-property m 'tags))))
-        (lambda (m)
-          (let ((music-tags (ly:music-property m 'tags)))
-            (or (null? music-tags)
-                (not (any (lambda (t) (memq t music-tags)) tag))))))
+    (tags-remove-predicate tags)
     music))
 
 resetRelativeOctave =
@@ -1441,18 +1458,25 @@ styledNoteHeads =
    (style-note-heads heads style music))
 
 tag =
-#(define-music-function (parser location tag music) (symbol-list-or-symbol? ly:music?)
-   (_i "Tag the following @var{music} with @var{tag} and return the
-result, by adding the single symbol or symbol list @var{tag} to the
+#(define-music-function (parser location tags music) (symbol-list-or-symbol? ly:music?)
+   (_i "Tag the following @var{music} with @var{tags} and return the
+result, by adding the single symbol or symbol list @var{tags} to the
 @code{tags} property of @var{music}.")
 
    (set!
     (ly:music-property music 'tags)
-    ((if (symbol? tag) cons append)
-     tag
+    ((if (symbol? tags) cons append)
+     tags
      (ly:music-property music 'tags)))
    music)
 
+tagGroup =
+#(define-void-function (parser location tags) (symbol-list?)
+   (_i "Define a tag group comprising the symbols in the symbol list
+@var{tags}.  Tag groups must not overlap.")
+   (let ((err (define-tag-group tags)))
+     (if err (ly:parser-error parser err location))))
+
 temporary =
 #(define-music-function (parser location music)
    (ly:music?)