%%%% 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
%%%% 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.13.29"
+\version "2.14.0"
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
#(define-music-function (parser location proc) (procedure?)
(_i "Modify context properties with Scheme procedure @var{proc}.")
(make-music 'ApplyContext
- 'origin location
'procedure proc))
applyMusic =
#(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))
#(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))))))
(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?)
'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))
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
(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
'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 =
#(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))
overrideTimeSignatureSettings =
#(define-music-function
- (parser location context time-signature base-moment beat-structure beam-exceptions)
- (symbol? pair? pair? cheap-list? cheap-list?)
+ (parser location time-signature base-moment beat-structure beam-exceptions)
+ (pair? pair? cheap-list? cheap-list?)
- (_i "Override @code{timeSignatureSettings} in @var{context}
+ (_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.
(let ((setting (make-setting base-moment beat-structure beam-exceptions)))
- (override-time-signature-setting time-signature setting context)))
+ (override-time-signature-setting time-signature setting)))
overrideProperty =
#(define-music-function (parser location name property value)
(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)
(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)
(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)
(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)
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?)
reference-note))
+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)
- (symbol? pair?)
+ (parser location time-signature)
+ (pair?)
- (_i "Revert @code{timeSignatureSettings} in @var{context}
+ (_i "Revert @code{timeSignatureSettings}
for time signatures of @var{time-signature}.")
- (revert-time-signature-setting time-signature context))
+ (revert-time-signature-setting time-signature))
rightHandFinger =
#(define-music-function (parser location finger) (number-or-string?)
(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
'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?)
(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)