%%%% 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
#(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)))
(_i "Insert a breath mark.")
(make-music 'BreathingEvent))
-
+%% Make slide indication for chords
+chordGlissando =
+#(define-music-function (parser location mus1 mus2) (ly:music? ly:music?)
+ "Make a glissando between the notes of triads @code{mus1} and @code{mus2}."
+
+ (define (add-glissando musChord)
+ (let ((els (ly:music-property musChord 'elements)))
+ (ly:music-set-property! musChord 'elements (append els (list (make-music 'GlissandoEvent))))
+ musChord))
+
+ (define (get-notes musicChord)
+ (filter (lambda(x) (eq? (ly:music-property x 'name) 'NoteEvent))
+ (ly:music-property musicChord 'elements)))
+
+ (define (select-note musChord index)
+ (let* ((notes (get-notes musChord))
+ (non-notes (filter (lambda (x)
+ (not (eq? (ly:music-property x 'name)
+ 'NoteEvent)))
+ (ly:music-property musChord 'elements)))
+ (selected-note (list-ref notes index))
+ (new-els (cons selected-note non-notes))
+ (new-mus (ly:music-deep-copy musChord)))
+ (ly:music-set-property! new-mus 'elements new-els)
+ new-mus))
+
+ (define (add-glissando-line mus1 mus2 index)
+ (context-spec-music
+ (context-spec-music
+ (make-sequential-music
+ (list
+ hideNotes
+ (make-grob-property-set 'StringNumber 'transparent #t)
+ (make-grob-property-set 'NoteColumn 'ignore-collision #t)
+ ;; obviously, this isn't equivalent to \once,
+ ;; so could be changed if required
+ (make-grob-property-set 'Glissando 'thickness 2)
+ (make-grob-property-set 'DynamicText 'transparent #t)
+ (make-grob-property-set 'DynamicLineSpanner 'transparent #t)
+ (make-grob-property-set 'DynamicTextSpanner 'transparent #t)
+ (add-glissando (select-note mus1 index))
+ (select-note mus2 index)))
+ 'Bottom (symbol->string (gensym)))
+ 'Staff))
+
+ (let* ((notes1 (get-notes mus1))
+ (notes2 (get-notes mus2))
+ (note-count (min (length notes1) (length notes2))))
+
+ #{
+ \once \override Glissando #'minimum-length = #4
+ \once \override Glissando #'springs-and-rods = #ly:spanner::set-spacing-rods
+ <<
+ {
+ $(add-glissando mus1)
+ $mus2
+ }
+ $(make-simultaneous-music
+ (map (lambda (x)
+ (add-glissando-line mus1 mus2 x))
+ (iota note-count)))
+ >>
+ \revert NoteColumn #'ignore-collision
+ #}))
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}.")
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))
+
+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))
grace =
#(def-grace-function startGraceMusic stopGraceMusic
(_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 =
(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)
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 time-signature)
'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?)