]> git.donarmstrong.com Git - lilypond.git/blobdiff - ly/music-functions-init.ly
Loglevels: Add ly:input-warning, ly:music-warning Scheme functions
[lilypond.git] / ly / music-functions-init.ly
index 52299a036176b3210a42314b26f9be03af591f17..f82ac0b4e350c9328efe85784632862cff5ccff7 100644 (file)
@@ -2,7 +2,7 @@
 
 %%%% This file is part of LilyPond, the GNU music typesetter.
 %%%%
-%%%% Copyright (C) 2003--2010 Han-Wen Nienhuys <hanwen@xs4all.nl>
+%%%% Copyright (C) 2003--2011 Han-Wen Nienhuys <hanwen@xs4all.nl>
 %%%%                          Jan Nieuwenhuizen <janneke@gnu.org>
 %%%%
 %%%% LilyPond is free software: you can redistribute it and/or modify
@@ -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.12.0"
+\version "2.14.0"
 
 
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
@@ -91,7 +91,6 @@ applyContext =
 #(define-music-function (parser location proc) (procedure?)
    (_i "Modify context properties with Scheme procedure @var{proc}.")
    (make-music 'ApplyContext
-              'origin location
               'procedure proc))
 
 applyMusic =
@@ -103,7 +102,6 @@ applyOutput =
 #(define-music-function (parser location ctx proc) (symbol? procedure?)
    (_i "Apply function @code{proc} to every layout object in context @code{ctx}")
    (make-music 'ApplyOutputEvent
-              'origin location
               'procedure proc
               'context-type ctx))
 
@@ -170,12 +168,11 @@ barNumberCheck =
 #(define-music-function (parser location n) (integer?)
    (_i "Print a warning if the current bar number is not @var{n}.")
    (make-music 'ApplyContext
-              'origin location
               'procedure
               (lambda (c)
                 (let ((cbn (ly:context-property c 'currentBarNumber)))
                   (if (and  (number? cbn) (not (= cbn n)))
-                      (ly:input-message location
+                      (ly:input-warning location
                                         "Barcheck failed got ~a expect ~a"
                                         cbn n))))))
 
@@ -198,21 +195,57 @@ bookOutputSuffix =
    (set! book-output-suffix newsuffix)
    (make-music 'SequentialMusic 'void #t))
 
-%% why a function?
+%% \breathe is defined as a music function rather than an event identifier to
+%% ensure it gets useful input location information: as an event identifier,
+%% it would have to be wrapped in an EventChord to prevent it from being
+%% treated as a post_event by the parser
 breathe =
 #(define-music-function (parser location) ()
    (_i "Insert a breath mark.")
-   (make-music 'EventChord
-              'origin location
-              'elements (list (make-music 'BreathingEvent))))
-
-
+   (make-music 'BreathingEvent))
 
 clef =
 #(define-music-function (parser location type) (string?)
    (_i "Set the current clef to @var{type}.")
    (make-clef-set type))
 
+
+compoundMeter =
+#(define-music-function (parser location args) (pair?)
+  (_i "Create compound time signatures. The argument is a Scheme list of
+lists. Each list describes one fraction, with the last entry being the
+denominator, while the first entries describe the summands in the
+enumerator. If the time signature consists of just one fraction,
+the list can be given directly, i.e. not as a list containing a single list.
+For example, a time signature of (3+1)/8 + 2/4 would be created as
+@code{\\compoundMeter #'((3 1 8) (2 4))}, and a time signature of (3+2)/8
+as @code{\\compoundMeter #'((3 2 8))} or shorter
+@code{\\compoundMeter #'(3 2 8)}.")
+  (let* ((mlen (calculate-compound-measure-length args))
+         (beat (calculate-compound-base-beat args))
+         (beatGrouping (calculate-compound-beat-grouping args))
+         (timesig (cons (ly:moment-main-numerator mlen)
+                        (ly:moment-main-denominator mlen))))
+  #{
+    \once \override Staff.TimeSignature #'stencil = #(lambda (grob)
+               (grob-interpret-markup grob (format-compound-time $args)))
+    \set Timing.timeSignatureFraction = $timesig
+    \set Timing.baseMoment = $beat
+    \set Timing.beatStructure = $beatGrouping
+    \set Timing.beamExceptions = #'()
+    \set Timing.measureLength = $mlen
+  #} ))
+
+
+cueClef =
+#(define-music-function (parser location type) (string?)
+  (_i "Set the current cue clef to @var{type}.")
+  (make-cue-clef-set type))
+cueClefUnset =
+#(define-music-function (parser location) ()
+  (_i "Unset the current cue clef.")
+  (make-cue-clef-unset))
+
 cueDuring =
 #(define-music-function
    (parser location what dir main-music) (string? ly:dir? ly:music?)
@@ -223,8 +256,20 @@ in a CueVoice oriented by @var{dir}.")
               'quoted-context-type 'Voice
               'quoted-context-id "cue"
               'quoted-music-name what
-              'quoted-voice-direction dir
-              'origin location))
+              'quoted-voice-direction dir))
+
+cueDuringWithClef =
+#(define-music-function
+   (parser location what dir clef main-music) (string? ly:dir? string? ly:music?)
+   (_i "Insert contents of quote @var{what} corresponding to @var{main-music},
+in a CueVoice oriented by @var{dir}.")
+   (make-music 'QuoteMusic
+              'element main-music
+              'quoted-context-type 'Voice
+              'quoted-context-id "cue"
+              'quoted-music-name what
+              'quoted-music-clef clef
+              'quoted-voice-direction dir))
 
 
 
@@ -295,13 +340,89 @@ featherDurations=
 
      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
+              '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})")
+   #{
+     \footnoteGrob $grob-name $offset \markup { \null } $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
+              'X-offset (car offset)
+              'Y-offset (cdr offset)
+              'text text
+              'footnote-text footnote))
+
+% this function can't be a simple copy and past of the above because
+% it needs to be encapsulated in a Sequential Music.
+% so, there's a code dup of above :-(
+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
+              'X-offset (car offset)
+              'Y-offset (cdr offset)
+              'text (make-null-markup)
+              'footnote-text footnote))
 
 grace =
 #(def-grace-function startGraceMusic stopGraceMusic
    (_i "Insert @var{music} as grace notes."))
 
-
+harmonicByFret = #(define-music-function (parser location fret music) (number? ly:music?)
+  (let* ((fret (number->string fret))
+         (pitch (fret->pitch fret)))
+        (make-sequential-music
+         (list
+          #{
+            \override TabNoteHead #'stencil = #(tab-note-head::print-custom-fret-label $fret)
+          #}
+          (make-harmonic
+            (calc-harmonic-pitch pitch music))
+          #{
+            \revert TabNoteHead #'stencil
+          #}))))
+
+harmonicByRatio = #(define-music-function (parser location ratio music) (number? ly:music?)
+  (let ((pitch (ratio->pitch ratio))
+        (fret (ratio->fret ratio)))
+       (make-sequential-music
+        (list
+         #{
+           \override TabNoteHead #'stencil = #(tab-note-head::print-custom-fret-label $fret)
+         #}
+         (make-harmonic
+           (calc-harmonic-pitch pitch music))
+         #{
+            \revert TabNoteHead #'stencil
+         #}))))
 
 instrumentSwitch =
 #(define-music-function
@@ -312,7 +433,7 @@ instrumentSwitch =
          (instrument-def (if handle (cdr handle) '())))
 
      (if (not handle)
-        (ly:input-message location "No such instrument: ~a" name))
+        (ly:input-warning location "No such instrument: ~a" name))
      (context-spec-music
       (make-music 'SimultaneousMusic
                  'elements
@@ -360,19 +481,65 @@ label =
                                           'page-label label))))
 
 
+language =
+#(define-music-function (parser location language) (string?)
+   (_i "Set note names for language @var{language}.")
+   (note-names-language parser language)
+   (make-music 'Music 'void #t))
+
+languageSaveAndChange =
+#(define-music-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)
+  (make-music 'Music 'void #t))
+
+languageRestore =
+#(define-music-function (parser location) ()
+   (_i "Restore a previously-saved pitchnames alist.")
+   (if previous-pitchnames
+       (begin
+        (set! pitchnames previous-pitchnames)
+        (ly:parser-set-note-names parser pitchnames))
+      (ly:input-warning location (_ "No other language was defined previously. Ignoring.")))
+   (make-music 'Music 'void #t))
+
 
 makeClusters =
 #(define-music-function (parser location arg) (ly:music?)
    (_i "Display chords in @var{arg} as clusters.")
    (music-map note-to-cluster arg))
 
+modalInversion =
+#(define-music-function (parser location around to scale music)
+    (ly:music? ly:music? ly:music? ly:music?)
+    (_i "Invert @var{music} about @var{around} using @var{scale} and
+transpose from @var{around} to @var{to}.")
+    (let ((inverter (make-modal-inverter around to scale)))
+      (change-pitches music inverter)
+      music))
+
+modalTranspose =
+#(define-music-function (parser location from to scale music)
+    (ly:music? ly:music? ly:music? ly:music?)
+    (_i "Transpose @var{music} from pitch @var{from} to pitch @var{to}
+using @var{scale}.")
+    (let ((transposer (make-modal-transposer from to scale)))
+      (change-pitches music transposer)
+      music))
+
+inversion =
+#(define-music-function
+   (parser location around to music) (ly:music? ly:music? ly:music?)
+   (_i "Invert @var{music} about @var{around} and
+transpose from @var{around} to @var{to}.")
+   (music-invert around to music))
+
 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.")
    (music-map proc mus))
 
-
-
 %% noPageBreak and noPageTurn are music functions (not music indentifiers),
 %% because music identifiers are not allowed at top-level.
 noPageBreak =
@@ -401,37 +568,27 @@ octaveCheck =
 #(define-music-function (parser location pitch-note) (ly:music?)
    (_i "Octave check.")
    (make-music 'RelativeOctaveCheck
-              'origin location
               'pitch (pitch-of-note pitch-note)))
 
 ottava =
-#(define-music-function (parser location octave) (number?)
+#(define-music-function (parser location octave) (integer?)
    (_i "Set the octavation.")
-   (make-ottava-set octave))
+   (make-music 'OttavaMusic
+              'ottava-number octave))
 
-overrideBeamSettings =
+overrideTimeSignatureSettings =
 #(define-music-function
-   (parser location context time-signature rule-type grouping-rule)
-   (symbol? pair? symbol? pair?)
-
-   (_i "Override beamSettings in @var{context}
-for time signatures of @var{time-signature} and rules of type
-@var{rule-type} to have a grouping rule alist
-@var{grouping-rule}.
-@var{rule-type} can be @code{end} or @code{subdivide},
-with a potential future value of @code{begin}.
-@var{grouping-rule} is an alist of @var{(beam-type . grouping)}
-entries.  @var{grouping} is in units of @var{beam-type}.  If
-@var{beam-type} is @code{*}, grouping is in units of the denominator
-of @var{time-signature}.")
+   (parser location time-signature base-moment beat-structure beam-exceptions)
+   (pair? pair? cheap-list? cheap-list?)
+
+   (_i "Override @code{timeSignatureSettings}
+for time signatures of @var{time-signature} to have settings
+of @var{base-moment}, @var{beat-structure}, and @var{beam-exceptions}.")
 
    ;; TODO -- add warning if largest value of grouping is
    ;;      greater than time-signature.
-
-   #{
-     #(override-beam-setting
-       $time-signature $rule-type $grouping-rule $context)
-   #})
+  (let ((setting (make-setting base-moment beat-structure beam-exceptions)))
+    (override-time-signature-setting time-signature setting)))
 
 overrideProperty =
 #(define-music-function (parser location name property value)
@@ -452,7 +609,6 @@ or @code{\"GrobName\"}.")
           (set! context-name (string->symbol (list-ref name-components 0)))))
 
      (make-music 'ApplyOutputEvent
-                'origin location
                 'context-type context-name
                 'procedure
                 (lambda (grob orig-context context)
@@ -569,7 +725,7 @@ Example:
                              (let ((moment-reference (ly:music-length (car seqs))))
                                (for-each (lambda (seq moment)
                                            (if (not (equal? moment moment-reference))
-                                               (ly:music-message seq
+                                               (ly:music-warning seq
                                                                  "Bars in parallel music don't have the same length")))
                                          seqs (map-in-order ly:music-length seqs))))
            voices)
@@ -608,6 +764,27 @@ that they share a staff.")
    (make-part-combine-music parser
                             (list part1 part2)))
 
+partcombineForce =
+#(define-music-function (location parser type once) (symbol-or-boolean? boolean?)
+   (_i "Override the part-combiner.")
+   (make-music 'EventChord
+              'elements (list (make-music 'PartCombineForceEvent
+                                          'forced-type type
+                                          'once once))))
+partcombineApart = \partcombineForce #'apart ##f
+partcombineApartOnce = \partcombineForce #'apart ##t
+partcombineChords = \partcombineForce #'chords ##f
+partcombineChordsOnce = \partcombineForce #'chords ##t
+partcombineUnisono = \partcombineForce #'unisono ##f
+partcombineUnisonoOnce = \partcombineForce #'unisono ##t
+partcombineSoloI = \partcombineForce #'solo1 ##f
+partcombineSoloIOnce = \partcombineForce #'solo1 ##t
+partcombineSoloII = \partcombineForce #'solo2 ##f
+partcombineSoloIIOnce = \partcombineForce #'solo2 ##t
+partcombineAutomatic = \partcombineForce ##f ##f
+partcombineAutomaticOnce = \partcombineForce ##f ##t
+
+
 pitchedTrill =
 #(define-music-function
    (parser location main-note secondary-note)
@@ -631,7 +808,7 @@ print @var{secondary-note} as a stemless note head in parentheses.")
                  (for-each (lambda (m)
                              (ly:music-set-property! m 'pitch trill-pitch)) trill-events)
                  (begin
-                   (ly:warning (_ "Second argument of \\pitchedTrill should be single note: "))
+                   (ly:input-warning location (_ "Second argument of \\pitchedTrill should be single note: "))
                    (display sec-note-events)))
 
              (if (eq? forced #t)
@@ -648,8 +825,7 @@ of the quoted voice, as specified in an @code{\\addQuote} command.
 usually contains spacers or multi-measure rests.")
    (make-music 'QuoteMusic
                'element main-music
-               'quoted-music-name what
-               'origin location))
+               'quoted-music-name what))
 
 removeWithTag =
 #(define-music-function (parser location tag music) (symbol? ly:music?)
@@ -675,18 +851,20 @@ resetRelativeOctave =
 
      reference-note))
 
-revertBeamSettings =
+retrograde =
+#(define-music-function (parser location music)
+    (ly:music?)
+    (_i "Return @var{music} in reverse order.")
+    (retrograde-music music))
+
+revertTimeSignatureSettings =
 #(define-music-function
-   (parser location context time-signature rule-type)
-   (symbol? pair? symbol?)
+   (parser location time-signature)
+   (pair?)
 
-   (_i "Revert beam settings in @var{context} for time signatures of
-@var{time-signature} and groups of type
-@var{group-type}.  @var{group-type} can be @code{end}
-or @code{subdivide}.")
-   #{
-     #(revert-beam-setting $time-signature $rule-type $context)
-   #})
+   (_i "Revert @code{timeSignatureSettings}
+for time signatures of @var{time-signature}.")
+   (revert-time-signature-setting time-signature))
 
 rightHandFinger =
 #(define-music-function (parser location finger) (number-or-string?)
@@ -710,26 +888,6 @@ scaleDurations =
    (ly:music-compress music
                      (ly:make-moment (car fraction) (cdr fraction))))
 
-setBeatGrouping =
-#(define-music-function (parser location grouping) (pair?)
-   (_i "Set the beat grouping in the current time signature to
-@var{grouping}.")
-   (define (default-group-setting c)
-     (let* ((context-time-signature
-            (ly:context-property c 'timeSignatureFraction))
-           (time-signature (if (null? context-time-signature)
-                               '(4 . 4)
-                               context-time-signature)))
-       (override-property-setting
-       c
-       'beamSettings
-       (list time-signature 'end)
-       (list (cons '* grouping)))))
-
-   (context-spec-music
-    (make-apply-context default-group-setting)
-    'Score))
-
 shiftDurations =
 #(define-music-function (parser location dur dots arg)
    (integer? integer? ly:music?)
@@ -739,6 +897,11 @@ shiftDurations =
     (lambda (x)
       (shift-one-duration-log x dur dots)) arg))
 
+slashedGrace =
+#(def-grace-function startSlashedGraceMusic stopSlashedGraceMusic
+   (_i "Create slashed graces (slashes through stems, but no slur) from
+the following music expression"))
+
 spacingTweaks =
 #(define-music-function (parser location parameters) (list?)
    (_i "Set the system stretch, by reading the 'system-stretch property of
@@ -792,8 +955,7 @@ as a first or second voice.")
               'quoted-context-id "cue"
               'quoted-music-name what
               'quoted-voice-direction dir
-              'quoted-transposition (pitch-of-note pitch-note)
-              'origin location))
+              'quoted-transposition (pitch-of-note pitch-note)))
 
 transposition =
 #(define-music-function (parser location pitch-note) (ly:music?)
@@ -811,7 +973,7 @@ tweak =
 
    (if (equal? (object-property sym 'backend-type?) #f)
        (begin
-        (ly:warning (_ "cannot find property type-check for ~a") sym)
+        (ly:input-warning location (_ "cannot find property type-check for ~a") sym)
         (ly:warning (_ "doing assignment anyway"))))
    (set!
     (ly:music-property arg 'tweaks)