]> git.donarmstrong.com Git - lilypond.git/blob - ly/music-functions-init.ly
517a9e7ed964f0f8029b19f42570a058d73541b4
[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 %#(use-modules (scm display-lily))
52 %displayLilyMusic =
53 %#(def-music-function (parser location music) (ly:music?)
54 %   (display-lily-init parser)
55 %   (display-lily-music music)
56 %   music)
57
58 applyoutput =
59 #(def-music-function (parser location proc) (procedure?)
60                 (make-music 'ApplyOutputEvent 
61                   'origin location
62                   'procedure proc))
63
64 breathe =
65 #(def-music-function (parser location) ()
66             (make-music 'EventChord 
67               'origin location
68               'elements (list (make-music 'BreathingSignEvent))))
69
70
71 unfoldRepeats =
72 #(def-music-function (parser location music) (ly:music?)
73                   (unfold-repeats music))
74
75 compressMusic =
76 #(def-music-function
77                   (parser location fraction music) (number-pair? ly:music?)
78                   (ly:music-compress music (ly:make-moment (car fraction) (cdr fraction))))
79
80 makeClusters =
81 #(def-music-function
82                 (parser location arg) (ly:music?)
83                 (music-map note-to-cluster arg))
84
85
86 removeWithTag = 
87 #(def-music-function
88   (parser location tag music) (symbol? ly:music?)
89   (music-filter
90    (lambda (m)
91     (let* ((tags (ly:music-property m 'tags))
92            (res (memq tag tags)))
93      (not res)))
94  music))
95               
96 keepWithTag =
97 #(def-music-function
98   (parser location tag music) (symbol? ly:music?)
99   (music-filter
100    (lambda (m)
101     (let* ((tags (ly:music-property m 'tags))
102            (res (memq tag tags)))
103      (or
104       (eq? tags '())
105       res)))
106    music))
107
108
109 %% Todo:
110 %% doing
111 %% def-music-function in a .scm causes crash.
112
113 cueDuring = 
114 #(def-music-function
115   (parser location what dir main-music)
116   (string? ly:dir? ly:music?)
117   (make-music 'QuoteMusic
118               'element main-music 
119               'quoted-context-type 'Voice
120               'quoted-context-id "cue"
121               'quoted-music-name what
122               'quoted-voice-direction dir
123               'origin location))
124
125
126 quoteDuring = #
127 (def-music-function
128   (parser location what main-music)
129   (string? ly:music?)
130   (make-music 'QuoteMusic
131               'element main-music
132               'quoted-music-name what
133               'origin location))
134
135
136
137 pitchedTrill =
138 #(def-music-function
139    (parser location main-note secondary-note)
140    (ly:music? ly:music?)
141    (let*
142        ((get-notes (lambda (ev-chord)
143                      (filter
144                       (lambda (m) (eq? 'NoteEvent (ly:music-property m 'name)))
145                       (ly:music-property ev-chord 'elements))))
146         (sec-note-events (get-notes secondary-note))
147         (trill-events (filter (lambda (m) (memq 'trill-span-event (ly:music-property m 'types)))
148                               (ly:music-property main-note 'elements)))
149
150         (trill-pitch
151          (if (pair? sec-note-events)
152              (ly:music-property (car sec-note-events) 'pitch)
153              )))
154      
155      (if (ly:pitch? trill-pitch)
156          (for-each (lambda (m) (ly:music-set-property! m 'trill-pitch trill-pitch))
157                    trill-events)
158          (begin
159            (ly:warning (_ "Second argument of \\pitchedTrill should be single note: "))
160            (display sec-note-events)))
161
162      main-note))
163
164 killCues =
165 #(def-music-function
166    (parser location music)
167    (ly:music?)
168    (music-map
169     (lambda (mus)
170       (if (string? (ly:music-property mus 'quoted-music-name))
171           (ly:music-property mus 'element)
172           mus)) music))
173    
174
175 afterGraceFraction =
176 #(cons 6 8)
177
178 afterGrace =
179 #(def-music-function
180   (parser location main grace)
181   (ly:music? ly:music?)
182
183   (let*
184       ((main-length (ly:music-length main))
185        (fraction  (ly:parser-lookup parser 'afterGraceFraction)))
186     
187     (make-simultaneous-music
188      (list
189       main
190       (make-sequential-music
191        (list
192
193         (make-music 'SkipMusic
194                     'duration (ly:make-duration
195                                0 0
196                                (* (ly:moment-main-numerator main-length)
197                                   (car fraction))
198                                (* (ly:moment-main-denominator main-length)
199                                   (cdr fraction)) ))
200         (make-music 'GraceMusic
201                     'element grace)))))))
202
203
204 barNumberCheck =
205 #(def-music-function (parser location n) (integer?)
206    (make-music 'ApplyContext 
207                'origin location
208                'procedure 
209                (lambda (c)
210                  (let*
211                      ((cbn (ly:context-property c 'currentBarNumber)))
212                    (if (not (= cbn n))
213                        (ly:input-message location "Barcheck failed got ~a expect ~a"
214                                          cbn n))))))
215
216
217 %{
218
219 TODO:
220
221 remove these from the parser, and softcode here:
222
223  * \tag
224
225 with small syntax changes, we could also do
226
227  * \bar
228  *  ?
229
230 %}
231