]> git.donarmstrong.com Git - lilypond.git/blob - ly/music-functions-init.ly
* Documentation/user/tutorial.itely (Running LilyPond for the
[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          (ly:warning (_ "Second argument of \\pitchedTrill should be single note.")))
151
152      main-note))
153
154 killCues =
155 #(def-music-function
156    (parser location music)
157    (ly:music?)
158    (music-map
159     (lambda (mus)
160       (if (string? (ly:music-property mus 'quoted-music-name))
161           (ly:music-property mus 'element)
162           mus)) music))
163    
164
165 afterGraceFraction =
166 #(cons 6 8)
167
168 afterGrace =
169 #(def-music-function
170   (parser location main grace)
171   (ly:music? ly:music?)
172
173   (let*
174       ((main-length (ly:music-length main))
175        (fraction  (ly:parser-lookup parser 'afterGraceFraction)))
176     
177     (make-simultaneous-music
178      (list
179       main
180       (make-sequential-music
181        (list
182
183         (make-music 'SkipMusic
184                     'duration (ly:make-duration
185                                0 0
186                                (* (ly:moment-main-numerator main-length)
187                                   (car fraction))
188                                (* (ly:moment-main-denominator main-length)
189                                   (cdr fraction)) ))
190         (make-music 'GraceMusic
191                     'element grace)))))))
192
193 %{
194
195 TODO:
196
197 remove these from the parser, and softcode here:
198
199  * \tag
200
201 with small syntax changes, we could also do
202
203  * \bar
204  *  ?
205
206 %}