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