]> git.donarmstrong.com Git - lilypond.git/blobdiff - ly/music-functions-init.ly
Fold set-time-signature into \time
[lilypond.git] / ly / music-functions-init.ly
index e5f46832a75ec7f4e32f4b0f605e491ec8867235..3b3a5b4c3aff88f6c8fb40eb50b3f60e8c76b7aa 100644 (file)
@@ -18,7 +18,7 @@
 %%%% You should have received a copy of the GNU General Public License
 %%%% along with LilyPond.  If not, see <http://www.gnu.org/licenses/>.
 
-\version "2.14.0"
+\version "2.15.18"
 
 
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
@@ -38,13 +38,13 @@ acciaccatura =
 %% keep these two together
 "instrument-definitions" = #'()
 addInstrumentDefinition =
-#(define-scheme-function
+#(define-void-function
    (parser location name lst) (string? list?)
    (_i "Create instrument @var{name} with properties @var{list}.")
    (set! instrument-definitions (acons name lst instrument-definitions)))
 
 addQuote =
-#(define-scheme-function (parser location name music) (string? ly:music?)
+#(define-void-function (parser location name music) (string? ly:music?)
    (_i "Define @var{music} as a quotable music expression named
 @var{name}")
    (add-quotable parser name music))
@@ -90,15 +90,13 @@ appendToTag =
    (symbol? ly:music? ly:music?)
    (_i "Append @var{more} to the @code{elements} of all music
 expressions in @var{music} that are tagged with @var{tag}.")
-   (music-map-copy (lambda (m)
-                    (if (memq tag (ly:music-property m 'tags))
-                        (begin
-                          (set! m (music-clone m))
-                          (set! (ly:music-property m 'elements)
-                                (append (ly:music-property m 'elements)
-                                        (list more)))))
-                    m)
-                  music))
+   (music-map (lambda (m)
+               (if (memq tag (ly:music-property m 'tags))
+                   (set! (ly:music-property m 'elements)
+                         (append (ly:music-property m 'elements)
+                                 (list more))))
+               m)
+             music))
 
 applyContext =
 #(define-music-function (parser location proc) (procedure?)
@@ -126,23 +124,13 @@ appoggiatura =
 assertBeamQuant =
 #(define-music-function (parser location l r) (pair? pair?)
    (_i "Testing function: check whether the beam quants @var{l} and @var{r} are correct")
-   (make-grob-property-override 'Beam 'positions
-                               (ly:make-simple-closure
-                                (ly:make-simple-closure
-                                 (append
-                                  (list chain-grob-member-functions `(,cons 0 0))
-                                  (check-quant-callbacks l r))))))
+   (make-grob-property-override 'Beam 'positions (check-quant-callbacks l r)))
 
 % for regression testing purposes.
 assertBeamSlope =
 #(define-music-function (parser location comp) (procedure?)
    (_i "Testing function: check whether the slope of the beam is the same as @code{comp}")
-   (make-grob-property-override 'Beam 'positions
-                               (ly:make-simple-closure
-                                (ly:make-simple-closure
-                                 (append
-                                  (list chain-grob-member-functions `(,cons 0 0))
-                                  (check-slope-callbacks comp))))))
+   (make-grob-property-override 'Beam 'positions (check-slope-callbacks comp)))
 
 autochange =
 #(define-music-function (parser location music) (ly:music?)
@@ -196,12 +184,12 @@ bendAfter =
               'delta-step delta))
 
 bookOutputName =
-#(define-scheme-function (parser location newfilename) (string?)
+#(define-void-function (parser location newfilename) (string?)
    (_i "Direct output for the current book block to @var{newfilename}.")
    (set! book-filename newfilename))
 
 bookOutputSuffix =
-#(define-scheme-function (parser location newsuffix) (string?)
+#(define-void-function (parser location newsuffix) (string?)
    (_i "Set the output filename suffix for the current book block to
 @var{newsuffix}.")
    (set! book-output-suffix newsuffix))
@@ -239,7 +227,7 @@ as @code{\\compoundMeter #'((3 2 8))} or shorter
                         (ly:moment-main-denominator mlen))))
   #{
     \once \override Staff.TimeSignature #'stencil = #(lambda (grob)
-               (grob-interpret-markup grob (format-compound-time $args)))
+               (grob-interpret-markup grob (format-compound-time args)))
     \set Timing.timeSignatureFraction = $timesig
     \set Timing.baseMoment = $beat
     \set Timing.beatStructure = $beatGrouping
@@ -325,7 +313,9 @@ without the need of a specific end spanner.")
                                                 end-ev-chord))))
         total)
 
-       (ly:input-message location (_ "argument endSpanners is not an EventChord: ~a" music))))
+       (begin
+        (ly:input-message location (_ "argument endSpanners is not an EventChord: ~a" music))
+        music)))
 
 
 
@@ -420,7 +410,7 @@ harmonics played on a fretted instrument by touching the strings above @var{fret
         (make-sequential-music
          (list
           #{
-            \override TabNoteHead #'stencil = #(tab-note-head::print-custom-fret-label $fret)
+            \override TabNoteHead #'stencil = #(tab-note-head::print-custom-fret-label fret)
           #}
           (make-harmonic
             (calc-harmonic-pitch pitch music))
@@ -437,7 +427,7 @@ given through @var{ratio}.")
        (make-sequential-music
         (list
          #{
-           \override TabNoteHead #'stencil = #(tab-note-head::print-custom-fret-label $fret)
+           \override TabNoteHead #'stencil = #(tab-note-head::print-custom-fret-label fret)
          #}
          (make-harmonic
            (calc-harmonic-pitch pitch music))
@@ -479,6 +469,23 @@ keepWithTag =
         res)))
     music))
 
+key =
+#(define-music-function (parser location tonic pitch-alist)
+   ((ly:pitch? '()) (list? '()))
+   (_i "Set key to @var{tonic} and scale @var{pitch-alist}.
+If both are null, just generate @code{KeyChangeEvent}.")
+   (cond ((null? tonic) (make-music 'KeyChangeEvent))
+        ((null? pitch-alist)
+         (ly:parser-error parser (_ "second argument must be pitch list")
+                          location)
+         (make-music 'SequentialMusic 'void #t))
+        (else
+         (ly:music-transpose
+          (make-music 'KeyChangeEvent
+               'tonic (ly:make-pitch 0 0 0)
+               'pitch-alist pitch-alist)
+          tonic))))
+
 killCues =
 #(define-music-function (parser location music) (ly:music?)
    (_i "Remove cue notes from @var{music}.")
@@ -503,18 +510,18 @@ label =
 
 
 language =
-#(define-scheme-function (parser location language) (string?)
+#(define-void-function (parser location language) (string?)
    (_i "Set note names for language @var{language}.")
    (note-names-language parser language))
 
 languageSaveAndChange =
-#(define-scheme-function (parser location language) (string?)
+#(define-void-function (parser location language) (string?)
   (_i "Store the previous pitchnames alist, and set a new one.")
   (set! previous-pitchnames pitchnames)
   (note-names-language parser language))
 
 languageRestore =
-#(define-scheme-function (parser location) ()
+#(define-void-function (parser location) ()
    (_i "Restore a previously-saved pitchnames alist.")
    (if previous-pitchnames
        (begin
@@ -553,6 +560,22 @@ inversion =
 transpose from @var{around} to @var{to}.")
    (music-invert around to music))
 
+mark =
+#(define-music-function
+   (parser location label) ((scheme? '()))
+  "Make the music for the \\mark command."
+  (let* ((set (and (integer? label)
+                  (context-spec-music (make-property-set 'rehearsalMark label)
+                                     'Score)))
+        (ev (make-music 'MarkEvent
+                        'origin location)))
+
+    (if set
+       (make-sequential-music (list set ev))
+       (begin
+         (set! (ly:music-property ev 'label) label)
+         ev))))
+
 musicMap =
 #(define-music-function (parser location proc mus) (procedure? ly:music?)
    (_i "Apply @var{proc} to @var{mus} and all of the music it contains.")
@@ -588,6 +611,18 @@ octaveCheck =
    (make-music 'RelativeOctaveCheck
                'pitch pitch))
 
+once =
+#(define-music-function (parser location music) (ly:music?)
+   (_i "Set @code{once} to @code{#t} on all layout instruction events in @var{music}.")
+   (music-map
+    (lambda (m)
+      (cond ((music-is-of-type? m 'layout-instruction-event)
+            (set! (ly:music-property m 'once) #t))
+           ((ly:duration? (ly:music-property m 'duration))
+            (ly:music-warning m (_ "Cannot apply \\once to timed music"))))
+      m)
+    music))
+
 ottava =
 #(define-music-function (parser location octave) (integer?)
    (_i "Set the octavation.")
@@ -668,7 +703,7 @@ pageTurn =
                                           'break-permission 'force))))
 
 parallelMusic =
-#(define-scheme-function (parser location voice-ids music) (list? ly:music?)
+#(define-void-function (parser location voice-ids music) (list? ly:music?)
    (_i "Define parallel music sequences, separated by '|' (bar check signs),
 and assign them to the identifiers provided in @var{voice-ids}.
 
@@ -778,7 +813,21 @@ partcombine =
    (_i "Take the music in @var{part1} and @var{part2} and typeset so
 that they share a staff.")
    (make-part-combine-music parser
-                            (list part1 part2)))
+                            (list part1 part2) #f))
+
+partcombineUp =
+#(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 with stems directed upward.")
+   (make-part-combine-music parser
+                            (list part1 part2) UP))
+
+partcombineDown =
+#(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 with stems directed downward.")
+   (make-part-combine-music parser
+                            (list part1 part2) DOWN))
 
 partcombineForce =
 #(define-music-function (location parser type once) (symbol-or-boolean? boolean?)
@@ -850,14 +899,12 @@ pushToTag =
    (symbol? ly:music? ly:music?)
    (_i "Add @var{more} to the front of @code{elements} of all music
 expressions in @var{music} that are tagged with @var{tag}.")
-   (music-map-copy (lambda (m)
-                    (if (memq tag (ly:music-property m 'tags))
-                        (begin
-                          (set! m (music-clone m))
-                          (set! (ly:music-property m 'elements)
-                                (cons more (ly:music-property m 'elements)))))
-                    m)
-                  music))
+   (music-map (lambda (m)
+               (if (memq tag (ly:music-property m 'tags))
+                   (set! (ly:music-property m 'elements)
+                         (cons more (ly:music-property m 'elements))))
+               m)
+             music))
 
 quoteDuring =
 #(define-music-function (parser location what main-music) (string? ly:music?)
@@ -869,6 +916,14 @@ usually contains spacers or multi-measure rests.")
                'element main-music
                'quoted-music-name what))
 
+relative =
+#(define-music-function (parser location pitch music)
+   ((ly:pitch? (ly:make-pitch 0 0 0)) ly:music?)
+   (_i "Make @var{music} relative to @var{pitch} (default @code{c'}).")
+   (ly:make-music-relative! music pitch)
+   (make-music 'RelativeOctaveMusic
+              'element music))
+
 removeWithTag =
 #(define-music-function (parser location tag music) (symbol? ly:music?)
    (_i "Remove elements of @var{music} that are tagged with @var{tag}.")
@@ -914,7 +969,7 @@ rightHandFinger =
 
 scaleDurations =
 #(define-music-function (parser location fraction music)
-   (number-pair? ly:music?)
+   (fraction? ly:music?)
    (_i "Multiply the duration of events in @var{music} by @var{fraction}.")
    (ly:music-compress music
                      (ly:make-moment (car fraction) (cdr fraction))))
@@ -947,7 +1002,7 @@ the `parameters' assoc list.")
    #{
      \overrideProperty #"Score.NonMusicalPaperColumn"
      #'line-break-system-details
-     #$(list (cons 'alignment-extra-space (cdr (assoc 'system-stretch parameters)))
+     #(list (cons 'alignment-extra-space (cdr (assoc 'system-stretch parameters)))
             (cons 'system-Y-extent (cdr (assoc 'system-Y-extent parameters))))
    #})
 
@@ -976,6 +1031,25 @@ tag =
          (ly:music-property arg 'tags)))
    arg)
 
+time =
+#(define-music-function (parser location beat-structure fraction)
+   ((number-list? '()) fraction?)
+   (_i "Set @var{fraction} as time signature, with optional
+number list @var{beat-structure} before it.")
+  (make-music 'TimeSignatureMusic
+              'numerator (car fraction)
+              'denominator (cdr fraction)
+              'beat-structure beat-structure))
+
+times =
+#(define-music-function (parser location fraction music)
+   (fraction? ly:music?)
+   (_i "Scale @var{music} in time by @var{fraction}.")
+  (make-music 'TimeScaledMusic
+             'element (ly:music-compress music (ly:make-moment (car fraction) (cdr fraction)))
+             'numerator (car fraction)
+             'denominator (cdr fraction)))
+
 transpose =
 #(define-music-function
    (parser location from to music)
@@ -1037,6 +1111,11 @@ unfoldRepeats =
 as @code{\\repeat unfold}.")
    (unfold-repeats music))
 
+void =
+#(define-void-function (parser location arg) (scheme?)
+   (_i "Accept a scheme argument, return a void expression.
+Use this if you want to have a scheme expression evaluated
+because of its side-effects, but its value ignored."))
 
 
 withMusicProperty =