]> git.donarmstrong.com Git - lilypond.git/blob - ly/music-functions-init.ly
(addlyrics): set the 'origin property
[lilypond.git] / ly / music-functions-init.ly
1 \version "2.3.2"
2
3 #(defmacro-public def-music-function (args signature . body)
4   "Helper macro for `ly:make-music-function'.
5 Syntax:
6   (def-music-function (location arg1 arg2 ...) (arg1-type? arg2-type? ...)
7     ...function body...)
8 "
9   `(ly:make-music-function (list ,@signature)
10       (lambda (,@args)
11         ,@body)))
12
13 applymusic = #(def-music-function (location func music) (procedure? ly:music?)
14                (func music))
15
16 addlyrics = #(def-music-function (location music lyrics) (ly:music? ly:music?)
17               (make-music 'LyricCombineMusic 
18                           'origin location
19                           'elements (list music lyrics)))
20
21 #(defmacro def-grace-function (start stop)
22   `(def-music-function (location music) (ly:music?)
23      (make-music 'GraceMusic
24        'origin location
25        'element (make-music 'SequentialMusic
26                   'elements (list (ly:music-deep-copy ,start)
27                                   music
28                                   (ly:music-deep-copy ,stop))))))
29 grace = #(def-grace-function startGraceMusic stopGraceMusic)
30 acciaccatura = #(def-grace-function startAcciaccaturaMusic stopAcciaccaturaMusic)
31 appoggiatura = #(def-grace-function startAppoggiaturaMusic stopAppoggiaturaMusic)
32
33 partcombine = #(def-music-function (location part1 part2) (ly:music? ly:music?)
34                 (make-part-combine-music (list part1 part2)))
35
36 autochange = #(def-music-function (location music) (ly:music?)
37                (make-autochange-music music))
38
39 applycontext = #(def-music-function (location proc) (procedure?)
40                  (make-music 'ApplyContext 
41                    'origin location
42                    'procedure proc))
43
44 applyoutput = #(def-music-function (location proc) (procedure?)
45                 (make-music 'ApplyOutputEvent 
46                   'origin location
47                   'procedure proc))
48
49 breathe = #(def-music-function (location) ()
50             (make-music 'EventChord 
51               'origin location
52               'elements (list (make-music 'BreathingSignEvent))))
53
54 %% \mytag #'foo { ... } ==> OK
55 %% c-\mytag #'foo ^4    ==> KO
56 %{
57 #(use-modules (srfi srfi-1))
58 #(define-public (symbol-or-symbols? obj)
59   "Return #t iif obj is a symbol or a symbol list."
60   (or (symbol? obj)
61       (and (list? obj)
62            (null? (remove symbol? obj)))))
63
64 mytag = #(def-music-function (location tagname music) (symbol-or-symbols? ly:music?)
65         (set! (ly:music-property music 'tags)
66               ((if (list? tagname) append cons) tagname (ly:music-property music 'tags)))
67         music)
68 %}
69
70 %{
71
72 TODO:
73
74 remove these from the parser, and softcode here:
75
76  * \tag
77
78 with small syntax changes, we could also do
79
80  * \bar
81  *  ?
82
83 %}