]> git.donarmstrong.com Git - lilypond.git/blob - ly/music-functions-init.ly
d32a540f761d622a8a2b9ba65c1d8199420c7002
[lilypond.git] / ly / music-functions-init.ly
1 % -*-Scheme-*-
2
3 \version "2.6.0"
4
5 %% need SRFI-1 filter 
6
7 #(use-modules (srfi srfi-1))  
8
9 applyMusic =
10 #(def-music-function (parser location func music) (procedure? ly:music?)
11                (func music))
12
13 oldaddlyrics =
14 #(def-music-function (parser location music lyrics) (ly:music? ly:music?)
15
16               (make-music 'OldLyricCombineMusic 
17                           'origin location
18                           'elements (list music lyrics)))
19
20 grace =
21 #(def-grace-function startGraceMusic stopGraceMusic)
22
23 acciaccatura =
24 #(def-grace-function startAcciaccaturaMusic stopAcciaccaturaMusic)
25 appoggiatura =
26 #(def-grace-function startAppoggiaturaMusic stopAppoggiaturaMusic)
27
28 partcombine =
29 #(def-music-function (parser location part1 part2) (ly:music? ly:music?)
30                 (make-part-combine-music (list part1 part2)))
31
32 autochange =
33 #(def-music-function (parser location music) (ly:music?)
34                (make-autochange-music music))
35
36 applyContext =
37 #(def-music-function (parser location proc) (procedure?)
38                  (make-music 'ApplyContext 
39                    'origin location
40                    'procedure proc))
41
42 musicMap =
43 #(def-music-function (parser location proc mus) (procedure? ly:music?)
44              (music-map proc mus))
45
46 displayMusic =
47 #(def-music-function (parser location music) (ly:music?)
48                  (display-scheme-music music)
49                  music)
50
51 %% FIXME: guile-1.7 required?
52 %#(use-modules (scm display-lily))invalid module name for use-syntax ((srfi srfi-39))
53
54 #(use-modules (scm display-lily))
55 #(display-lily-init parser)
56 displayLilyMusic =
57 #(def-music-function (parser location music) (ly:music?)
58    (display-lily-music music)
59    music)
60
61 applyOutput =
62 #(def-music-function (parser location proc) (procedure?)
63                 (make-music 'ApplyOutputEvent 
64                   'origin location
65                   'procedure proc))
66
67 outputProperty =
68 #(def-music-function (parser location name prop value)
69    (symbol? symbol? scheme?)
70
71
72    "Set @var{prop} to @var{value} in all grobs named @var{name} "
73
74    (make-music 'ApplyOutputEvent
75                'origin location
76                'procedure
77                (lambda (grob orig-context context)
78                  (if (equal?
79                       (cdr (assoc 'name (ly:grob-property grob 'meta)))
80                       name)
81                      (set! (ly:grob-property grob prop) value)
82                  ))))
83
84 breathe =
85 #(def-music-function (parser location) ()
86             (make-music 'EventChord 
87               'origin location
88               'elements (list (make-music 'BreathingSignEvent))))
89
90
91 unfoldRepeats =
92 #(def-music-function (parser location music) (ly:music?)
93                   (unfold-repeats music))
94
95 compressMusic =
96 #(def-music-function
97                   (parser location fraction music) (number-pair? ly:music?)
98                   (ly:music-compress music (ly:make-moment (car fraction) (cdr fraction))))
99
100 makeClusters =
101 #(def-music-function
102                 (parser location arg) (ly:music?)
103                 (music-map note-to-cluster arg))
104
105
106 removeWithTag = 
107 #(def-music-function
108   (parser location tag music) (symbol? ly:music?)
109   (music-filter
110    (lambda (m)
111     (let* ((tags (ly:music-property m 'tags))
112            (res (memq tag tags)))
113      (not res)))
114  music))
115               
116 keepWithTag =
117 #(def-music-function
118   (parser location tag music) (symbol? ly:music?)
119   (music-filter
120    (lambda (m)
121     (let* ((tags (ly:music-property m 'tags))
122            (res (memq tag tags)))
123      (or
124       (eq? tags '())
125       res)))
126    music))
127
128
129 %% Todo:
130 %% doing
131 %% def-music-function in a .scm causes crash.
132
133 cueDuring = 
134 #(def-music-function
135   (parser location what dir main-music)
136   (string? ly:dir? ly:music?)
137   (make-music 'QuoteMusic
138               'element main-music 
139               'quoted-context-type 'Voice
140               'quoted-context-id "cue"
141               'quoted-music-name what
142               'quoted-voice-direction dir
143               'origin location))
144
145
146 quoteDuring = #
147 (def-music-function
148   (parser location what main-music)
149   (string? ly:music?)
150   (make-music 'QuoteMusic
151               'element main-music
152               'quoted-music-name what
153               'origin location))
154
155
156
157 pitchedTrill =
158 #(def-music-function
159    (parser location main-note secondary-note)
160    (ly:music? ly:music?)
161    (let*
162        ((get-notes (lambda (ev-chord)
163                      (filter
164                       (lambda (m) (eq? 'NoteEvent (ly:music-property m 'name)))
165                       (ly:music-property ev-chord 'elements))))
166         (sec-note-events (get-notes secondary-note))
167         (trill-events (filter (lambda (m) (memq 'trill-span-event (ly:music-property m 'types)))
168                               (ly:music-property main-note 'elements)))
169
170         (trill-pitch
171          (if (pair? sec-note-events)
172              (ly:music-property (car sec-note-events) 'pitch)
173              )))
174      
175      (if (ly:pitch? trill-pitch)
176          (for-each (lambda (m) (ly:music-set-property! m 'pitch trill-pitch))
177                    trill-events)
178          (begin
179            (ly:warning (_ "Second argument of \\pitchedTrill should be single note: "))
180            (display sec-note-events)))
181
182      main-note))
183
184 killCues =
185 #(def-music-function
186    (parser location music)
187    (ly:music?)
188    (music-map
189     (lambda (mus)
190       (if (string? (ly:music-property mus 'quoted-music-name))
191           (ly:music-property mus 'element)
192           mus)) music))
193    
194
195 afterGraceFraction =
196 #(cons 6 8)
197
198 afterGrace =
199 #(def-music-function
200   (parser location main grace)
201   (ly:music? ly:music?)
202
203   (let*
204       ((main-length (ly:music-length main))
205        (fraction  (ly:parser-lookup parser 'afterGraceFraction)))
206     
207     (make-simultaneous-music
208      (list
209       main
210       (make-sequential-music
211        (list
212
213         (make-music 'SkipMusic
214                     'duration (ly:make-duration
215                                0 0
216                                (* (ly:moment-main-numerator main-length)
217                                   (car fraction))
218                                (* (ly:moment-main-denominator main-length)
219                                   (cdr fraction)) ))
220         (make-music 'GraceMusic
221                     'element grace)))))))
222
223
224 barNumberCheck =
225 #(def-music-function (parser location n) (integer?)
226    (make-music 'ApplyContext 
227                'origin location
228                'procedure 
229                (lambda (c)
230                  (let*
231                      ((cbn (ly:context-property c 'currentBarNumber)))
232                    (if (not (= cbn n))
233                        (ly:input-message location "Barcheck failed got ~a expect ~a"
234                                          cbn n))))))
235
236
237 %{
238
239 TODO:
240
241 remove these from the parser, and softcode here:
242
243  * \tag
244
245 with small syntax changes, we could also do
246
247  * \bar
248  *  ?
249
250 %}
251