;;;; You should have received a copy of the GNU General Public License
;;;; along with LilyPond. If not, see <http://www.gnu.org/licenses/>.
+; for define-safe-public when byte-compiling using Guile V2
+(use-modules (scm safe-utility-defs))
+
;; (use-modules (ice-9 optargs))
;;; ly:music-property with setter
(music-map function e)))
(function music)))
-(define-public (music-map-copy function music)
- "Apply @var{function} to @var{music} and all of the music it contains.
-
-First it recurses over the children, then the function is applied to
-@var{music}. This can be used for non-destructive changes when the
-original @var{music} should retain its meaning. When you change an
-element, return a changed copy. Then all ancestors will recursively
-become changed copies as well. The check for change is done via
-@code{eq?}."
- (let* ((es (ly:music-property music 'elements))
- (e (ly:music-property music 'element))
- (esnew (pair-fold-right
- (lambda (y tail)
- (let ((res (music-map-copy function (car y))))
- (if (and (eq? (cdr y) tail)
- (eq? (car y) res))
- y
- (cons res tail))))
- '() es))
- (enew (if (ly:music? e)
- (music-map-copy function e)
- e)))
- (if (not (and (eq? es esnew)
- (eq? e enew)))
- (begin
- (set! music (music-clone music))
- (set! (ly:music-property music 'elements) esnew)
- (set! (ly:music-property music 'element) enew)))
- (function music)))
-
(define-public (music-filter pred? music)
"Filter out music expressions that do not satisfy @var{pred?}."
(define-public (shift-one-duration-log music shift dot)
"Add @var{shift} to @code{duration-log} of @code{'duration} in
-@var{music} and optionally @var{dot} to any note encountered. This
-scales the music up by a factor `2^@var{shift} * (2 - (1/2)^@var{dot})'."
+@var{music} and optionally @var{dot} to any note encountered.
+The number of dots in the shifted music may not be less than zero."
(let ((d (ly:music-property music 'duration)))
(if (ly:duration? d)
(let* ((cp (ly:duration-factor d))
- (nd (ly:make-duration (+ shift (ly:duration-log d))
- (+ dot (ly:duration-dot-count d))
- (car cp)
- (cdr cp))))
+ (nd (ly:make-duration
+ (+ shift (ly:duration-log d))
+ (max 0 (+ dot (ly:duration-dot-count d)))
+ (car cp)
+ (cdr cp))))
(set! (ly:music-property music 'duration) nd)))
music))
(make-music 'PropertyUnset
'symbol sym))
-;;; Need to keep this definition for \time calls from parser
-(define-public (make-time-signature-set num den)
- "Set properties for time signature @var{num}/@var{den}."
- (make-music 'TimeSignatureMusic
- 'numerator num
- 'denominator den
- 'beat-structure '()))
-
-;;; Used for calls that include beat-grouping setting
-(define-public (set-time-signature num den . rest)
- "Set properties for time signature @var{num}/@var{den}.
-If @var{rest} is present, it is used to set @code{beatStructure}."
- (ly:export
- (make-music 'TimeSignatureMusic
- 'numerator num
- 'denominator den
- 'beat-structure (if (null? rest) rest (car rest)))))
-
(define-safe-public (make-articulation name)
(make-music 'ArticulationEvent
'articulation-type name))
m))
(define-public (empty-music)
- (ly:export (make-music 'Music)))
+ (make-music 'Music))
;; Make a function that checks score element for being of a specific type.
(define-public (make-type-checker symbol)
(new-settings (append current
(list (list context-name grob sym val)))))
(ly:context-set-property! where 'graceSettings new-settings)))
- (ly:export (context-spec-music (make-apply-context set-prop) 'Voice)))
+ (context-spec-music (make-apply-context set-prop) 'Voice))
(define-public (remove-grace-property context-name grob sym)
"Remove all @var{sym} for @var{grob} in @var{context-name}."
(set! new-settings (delete x new-settings)))
prop-settings)
(ly:context-set-property! where 'graceSettings new-settings)))
- (ly:export (context-spec-music (make-apply-context delete-prop) 'Voice)))
+ (context-spec-music (make-apply-context delete-prop) 'Voice))
`(define-syntax-function scheme? ,@rest))
+(defmacro-public define-void-function rest
+ "This defines a Scheme function like @code{define-scheme-function} with
+void return value (i.e., what most Guile functions with `unspecified'
+value return). Use this when defining functions for executing actions
+rather than returning values, to keep Lilypond from trying to interpret
+the return value."
+ `(define-syntax-function (void? *unspecified*) ,@rest *unspecified*))
+
+(defmacro-public define-event-function rest
+ "Defining macro returning event functions.
+Syntax:
+ (define-event-function (parser location arg1 arg2 ...) (arg1-type? arg2-type? ...)
+ ...function body...)
+
+argX-type can take one of the forms @code{predicate?} for mandatory
+arguments satisfying the predicate, @code{(predicate?)} for optional
+parameters of that type defaulting to @code{#f}, @code{@w{(predicate?
+value)}} for optional parameters with a specified default
+value (evaluated at definition time). An optional parameter can be
+omitted in a call only when it can't get confused with a following
+parameter of different type.
+
+Predicates with syntactical significance are @code{ly:pitch?},
+@code{ly:duration?}, @code{ly:music?}, @code{markup?}. Other
+predicates require the parameter to be entered as Scheme expression.
+
+Must return an event expression. The @code{origin} is automatically
+set to the @code{location} parameter."
+
+ `(define-syntax-function (ly:event? (make-music 'Event 'void #t)) ,@rest))
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(car rest) 'Staff))
(pcontext (if (pair? rest)
(car rest) 'GrandStaff)))
- (ly:export
- (cond
+ (cond
;; accidentals as they were common in the 18th century.
((equal? style 'default)
(set-accidentals-properties #t
context))
(else
(ly:warning (_ "unknown accidental style: ~S") style)
- (make-sequential-music '()))))))
+ (make-sequential-music '())))))
(define-public (invalidate-alterations context)
"Invalidate alterations in @var{context}.
entry
(cons (car entry) (cons 'clef (cddr entry))))))
(ly:context-property context 'localKeySignature)))))
-
+
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(define-public (skip-of-length mus)