]> git.donarmstrong.com Git - lilypond.git/blob - scm/define-music-types.scm
Merge branch 'master' of git+ssh://jneem@git.sv.gnu.org/srv/git/lilypond
[lilypond.git] / scm / define-music-types.scm
1 ;;;; define-music-types.scm --
2 ;;;;
3 ;;;;  source file of the GNU LilyPond music typesetter
4 ;;;; 
5 ;;;; (c) 1998--2006 Han-Wen Nienhuys <hanwen@xs4all.nl>
6 ;;;;                 Jan Nieuwenhuizen <janneke@gnu.org>
7
8 ;; TODO: should link back into user manual.
9
10 (define (mm-rest-child-list music)
11   "Generate events for multimeasure rests, to be used by the sequential-iterator"
12   (let ((location (ly:music-property music 'origin))
13         (duration (ly:music-property music 'duration)))
14     (list (make-music 'BarCheck
15                       'origin location)
16           (make-event-chord (cons (make-music 'MultiMeasureRestEvent
17                                               'origin location
18                                               'duration duration)
19                                   (ly:music-property music 'articulations)))
20           (make-music 'BarCheck
21                       'origin location))))
22
23 (define-public music-descriptions
24   `(
25     (AbsoluteDynamicEvent
26      . (
27         (description . "Creates a dynamic mark.
28
29 Syntax: @var{note}@code{\\x},
30 where x is one of \\ppp, \\pp, \\p, \\mp, \\mf, \\f, \\ff, \\fff.")
31         (types . (general-music event dynamic-event absolute-dynamic-event))
32         ))
33
34     (AnnotateOutputEvent
35      . ((description . "Print an annotation of an output element.")
36         (types . (general-music event annotate-output-event))
37         ))
38         
39     (ApplyContext
40      . (
41         (description . "Call the argument with the current context during interpreting phase")
42         (types . (general-music apply-context))
43         (iterator-ctor . ,ly:apply-context-iterator::constructor)
44         ))
45     
46     (ApplyOutputEvent
47      . (
48         (description . "
49 Call the argument with all current grobs during interpreting phase.
50
51 Syntax
52
53 \\applyOutput #'Context FUNC
54
55 arguments to func are 1. the grob, 2. the originating context,
56 3. context where FUNC is called.
57
58 ")
59         (types . (general-music event apply-output-event))
60         ))
61     (ArpeggioEvent 
62      . (
63         (description .  "Make an arpeggio on this note.
64
65 Syntax:
66 @var{note}-@code{\\arpeggio}")
67         (types . (general-music arpeggio-event event))
68         ))
69
70     ;; todo: use articulation-event for slur as well.
71     ;; separate non articulation scripts  
72     (ArticulationEvent
73      . (
74         (description .  "Adds an articulation marking to a note.  
75
76 Syntax:
77 @var{note}@code{X}@code{Y}, where X is a direction (up @code{^}, down
78 @code{_}, or LilyPond's choice (no direction specified)), and where Y
79 is an articulation (such as @code{-.}, @code{->}, @code{\\tenuto},
80 @code{\\downbow}).  See the user manual for details.")
81
82         (types . (general-music event articulation-event script-event))
83         )) 
84     (AutoChangeMusic
85      . (
86         (description .  "Used for making voices that switch between piano staves automatically.")
87         (iterator-ctor . ,ly:auto-change-iterator::constructor)
88         (start-callback . ,ly:music-wrapper::start-callback)
89         (length-callback . ,ly:music-wrapper::length-callback)
90         (types . (general-music music-wrapper-music auto-change-instruction))
91         ))
92     (BarCheck
93      . (
94         (description .
95                      "Check whether this music coincides with the start of the measure.")
96         (types . (general-music bar-check))
97         (iterator-ctor . ,ly:bar-check-iterator::constructor)
98         ))
99     (BassFigureEvent
100      . (
101         (description .  "Print a bass-figure text")
102
103         (types . (general-music event rhythmic-event bass-figure-event))
104         ))
105     
106     (BeamEvent
107      . (
108         (description .  "Starts or stops a beam.  
109
110 Syntax for manual control:
111 c8-[ c c-] c8")
112         (types . (general-music event beam-event span-event))
113         ))
114     (BendAfterEvent
115      . ((description . "A drop/fall/doit jazz articulation")
116         (types . (general-music bend-after-event event))))
117
118     (BreathingEvent
119      . (
120         (description .  "Creates a `breath mark' or `comma'.  
121
122 Syntax:
123 @var{note}\\breathe.")
124
125         (types . (general-music event breathing-event))
126         )) 
127     (ContextChange
128      . (
129         (description .  "Change staffs in Piano staff. 
130
131 Syntax @code{\\translator Staff = @var{new-id}}.")
132         (iterator-ctor . , ly:change-iterator::constructor)
133         (types . (general-music translator-change-instruction))
134         ))
135
136     (ClusterNoteEvent
137      . ((description .  "A note that is part of a cluster.")
138
139         ;; not a note-event, to ensure that Note_engraver doesn't eat it. 
140         (types . (general-music cluster-note-event melodic-event rhythmic-event event))
141         ))
142     
143     (ContextSpeccedMusic
144      . (
145         (description .  "Interpret the argument music within a specific context.")
146         (iterator-ctor . ,ly:context-specced-music-iterator::constructor)
147         (length-callback . ,ly:music-wrapper::length-callback)
148         (start-callback . ,ly:music-wrapper::start-callback)
149         (types . (context-specification general-music music-wrapper-music))
150         ))
151     
152     (CrescendoEvent
153      . (
154         (description .  "Begins or ends a crescendo.  
155
156 Syntax: @var{note}\\cr
157 ... @var{note}\\rc (you can also use \\<, \\!, \\cresc, and
158 \\endcresc.  See the user manual for details.).")
159
160         (types . (general-music span-event span-dynamic-event crescendo-event event))
161         )) 
162     (DecrescendoEvent
163      . (
164         (description .  "See @ref{CrescendoEvent}.")
165
166         (types . (general-music span-event span-dynamic-event decrescendo-event event))
167         ))
168     
169     (ExtenderEvent
170      . (
171         (description .  "Extend lyrics.")
172
173         (types . (general-music extender-event event))
174         ))
175
176     (Event
177      . (
178         (description .  "Atomic music event.")
179         (types . (general-music event))
180         ))
181         
182     (EventChord
183      . (
184         (description .  "Internally used to group a set of events.")
185         (iterator-ctor . ,ly:event-chord-iterator::constructor)
186         (length-callback . ,ly:music-sequence::maximum-length-callback)
187         (to-relative-callback . ,ly:music-sequence::event-chord-relative-callback)
188         (types . (general-music event-chord simultaneous-music))
189         ))
190
191     
192     (FingeringEvent
193      . (
194         (description . "Specify what finger to use for this note.")
195         (types . (general-music fingering-event event))
196         ))
197     (BeamForbidEvent
198      . (
199         (description . "Specify that a note may not auto-beamed ")
200         (types . (general-music event beam-forbid-event))
201         ))
202     (GlissandoEvent
203      . (
204         (description .  "Start  a glissando on this note.")
205         (types . (general-music glissando-event event))
206         ))
207     
208     (GraceMusic
209      . (
210         (description .  "Interpret the argument as grace notes. ")
211         (start-callback . ,ly:grace-music::start-callback)
212         (length . ,ZERO-MOMENT)
213         (iterator-ctor . ,ly:grace-iterator::constructor)
214         (types . (grace-music music-wrapper-music general-music))
215         ))
216     (NoteGroupingEvent
217      . (
218         (description . "Start or stop grouping brackets.")
219         (types . (general-music event note-grouping-event))
220         ))
221     (HarmonicEvent
222      . (
223         (description . "Mark a note as harmonic")
224         (types . (general-music event harmonic-event))
225         ))
226     (HyphenEvent
227      . (
228         (description .  "A hyphen between lyric syllables.")
229
230         (types . (general-music hyphen-event event))
231         ))
232     
233     (KeyChangeEvent
234      . (
235         (description .  "Change the key signature. 
236
237 Syntax: @code{\\key } @var{name} @var{scale}.")
238         (to-relative-callback . ,(lambda (x p) p))
239         (types . (general-music key-change-event event))
240         ))
241     (LaissezVibrerEvent
242      . ((description . "Don't damp this chord.
243
244 Syntax: @var{note}\\laissezVibrer.")
245
246         (types . (general-music event laissez-vibrer-event))
247         ))
248     (LigatureEvent
249      . (
250         (description .  "Start or end a ligature.")
251         (span-type . ligature)
252         (types . (general-music span-event ligature-event event))
253         ))
254     (LineBreakEvent
255      . (
256         (description .  "Allow, forbid or force a line break.")
257         (types . (general-music line-break-event break-event event))
258         ))
259     
260     (LyricCombineMusic
261      . (
262         (description .  "Align lyrics to the start of notes.
263
264 Syntax @var{\\lyricsto }@var{voicename} @var{lyrics}.")
265         (length . ,ZERO-MOMENT)
266         (types . (general-music lyric-combine-music))
267         (iterator-ctor . ,ly:lyric-combine-music-iterator::constructor)
268         ))
269
270     (LyricEvent
271      . (
272         (description .  "A lyric syllable. Must be entered in lyrics mode, i.e.
273 @code{\\lyrics @{ twinkle4 twinkle4 @} } .")
274
275         (types . (general-music rhythmic-event lyric-event event))
276         ))
277     (MarkEvent
278      . (
279         (description .  "Insert a rehearsal mark. 
280
281 Syntax: @code{\\mark} @var{marker},
282 e.g. @code{\\mark \"A\"}.")
283
284         (types . (general-music mark-event event))
285         ))
286     (MultiMeasureRestMusic
287      . (
288         (description . "Rests that may be compressed into Multi rests. 
289
290 Syntax
291 @code{R2.*4} for 4 measures in 3/4 time.")
292         (iterator-ctor . ,ly:sequential-iterator::constructor)
293         (elements-callback . ,mm-rest-child-list)
294         (types . (general-music multi-measure-rest))
295         ))
296
297     (MultiMeasureRestEvent
298      . (
299         (description . "Used internally by MultiMeasureRestMusic to signal rests")
300         (types . (general-music event rhythmic-event multi-measure-rest-event))
301         ))
302     
303     (MultiMeasureTextEvent
304      . (
305         (description . "Texts on mm rests. 
306
307 Syntax
308 @code{R-\\markup @{ \\roman \"bla\" @}}. Note the explicit font switch.")
309         (types . (general-music event multi-measure-text-event))
310         ))
311
312     (Music
313      . (
314         (description .  "Generic type for music expressions.")
315
316         (types . (general-music)) 
317         ))
318     (NoteEvent
319      . (
320         (description .  "A note.")
321         (types . (general-music event note-event rhythmic-event melodic-event))
322         ))
323     
324     (OverrideProperty
325      . (
326         (description .  "Extend the definition of a graphical object.
327
328 SYNTAX
329
330 @code{\\override [ @var{Ctxt} . ] @var{Obj} @var{prop} = @var{val}}
331 ")
332         (types . (general-music layout-instruction-event override-property-event))
333         (iterator-ctor . ,ly:push-property-iterator::constructor)
334         ))
335     (PageBreakEvent
336      . (
337         (description .  "Allow, forbid or force a page break.")
338         (types . (general-music break-event page-break-event event))
339         ))
340     (PageTurnEvent
341      . (
342         (description .  "Allow, forbid or force a page turn.")
343         (types . (general-music break-event page-turn-event event))
344         ))
345     (PartCombineMusic
346      . (
347         (description .  "Combine two parts on a staff, either merged or
348 as separate voices.")
349         (length-callback . ,ly:music-sequence::maximum-length-callback)
350         (start-callback . ,ly:music-sequence::minimum-start-callback)
351         (types . (general-music part-combine-music))
352         (iterator-ctor . ,ly:part-combine-iterator::constructor)
353         ))
354     (PhrasingSlurEvent
355      . (
356         (description . "Start or end phrasing slur. 
357
358 Syntax NOTE \\(  and \\) NOTE")
359         (types . (general-music span-event event phrasing-slur-event))
360         ))
361     
362     (PropertySet
363      . (
364         (description .  "Set a context property.
365
366 Syntax: @code{\\property @var{context}.@var{prop} = @var{scheme-val}}.")
367         (types . (layout-instruction-event general-music))
368         (iterator-ctor . ,ly:property-iterator::constructor)
369         ))
370
371     (PropertyUnset
372      . (
373         (description .  "Remove the definition of a context @code{\\property}.")
374
375         (types . (layout-instruction-event general-music))
376         (iterator-ctor . ,ly:property-unset-iterator::constructor)
377         ))
378
379     (PercentEvent
380      . (
381         (description .  "Used internally to signal percent repeats.")
382         (types . (general-music event percent-event rhythmic-event))
383         ))
384
385     (PesOrFlexaEvent
386      . (
387         (description .  "Within a ligature, mark the previous and the
388 following note to form a pes (if melody goes up) or a flexa (if melody
389 goes down).")
390
391         (types . (general-music pes-or-flexa-event event))
392         ))
393
394     (QuoteMusic
395      . (
396         (description . "Quote preprocessed snippets of music. ")
397         (iterator-ctor . ,ly:music-wrapper-iterator::constructor)
398         (length-callback . ,ly:music-wrapper::length-callback)
399         (start-callback . ,ly:music-wrapper::start-callback)
400         (types . (general-music music-wrapper-music))
401         ))
402     
403     (RelativeOctaveCheck
404      . ((description . "Check if a pitch is in the correct octave.")
405         (to-relative-callback . ,ly:relative-octave-check::relative-callback)
406         (types . (general-music relative-octave-check))
407         ))
408     
409     (RepeatedMusic
410      . (
411         (description .  "Repeat music in different ways")
412         (types . (general-music repeated-music))
413         ))
414     (RepeatTieEvent
415      . (
416         (description . "Ties for starting a second volta bracket.")
417         (types . (general-music event repeat-tie-event))
418         ))
419     (RestEvent
420      . (
421         (description .  "A Rest. 
422
423 Syntax @code{r4} for a quarter rest. ")
424
425         (types . (general-music event rhythmic-event rest-event))
426         )) 
427     (RevertProperty
428      . (
429         (description .  "The opposite of @ref{OverrideProperty}: remove a
430 previously added property from a graphical object definition
431  ")
432
433         (types . (general-music layout-instruction-event))
434         (iterator-ctor . ,      ly:pop-property-iterator::constructor)
435         ))
436
437     (SequentialMusic
438      . (
439         (description .  "Music expressions concatenated. 
440
441 Syntax \\sequential @{..@} or simply @{..@} .")
442
443         (length-callback . ,ly:music-sequence::cumulative-length-callback)
444         (start-callback . ,ly:music-sequence::first-start-callback)
445         (elements-callback . ,(lambda (m) (ly:music-property m 'elements)))
446         (iterator-ctor . ,ly:sequential-iterator::constructor)
447         (types . (general-music sequential-music))
448         ))
449
450     (SoloOneEvent
451      . (
452         (description . "Print Solo.1")
453         (part-combine-status . solo1)
454         (types . (general-music event part-combine-event solo-one-event))
455         ))
456     (SoloTwoEvent
457      . (
458         (description . "Print Solo.2")
459         (part-combine-status . solo2)
460         (types . (general-music event part-combine-event solo-two-event))
461         ))
462     (UnisonoEvent
463      . ((description . "Print a2")
464         (part-combine-status . unisono)
465         (types . (general-music event part-combine-event unisono-event))))
466     
467     (SimultaneousMusic
468      . (
469         (description .  "Music playing together.
470
471 SYNTAX
472
473 @code{ \\simultaneous @{ .. @}} or << .. >>.")
474
475         (iterator-ctor . ,ly:simultaneous-music-iterator::constructor)
476         (start-callback . ,ly:music-sequence::minimum-start-callback)
477         (length-callback . ,ly:music-sequence::maximum-length-callback)
478         (to-relative-callback . ,ly:music-sequence::simultaneous-relative-callback)
479         
480         (types . (general-music simultaneous-music))
481         ))
482     
483     (SlurEvent
484      . (
485         (description . "Start or end slur. 
486
487 Syntax NOTE(     and NOTE) ")
488
489         (types . (general-music span-event event slur-event))
490         ))
491     
492     (StaffSpanEvent
493      . ((description . "Start or  stop a staff symbol.")
494         (types . (general-music event span-event staff-span-event))
495      ))
496     
497     (TextSpanEvent
498      . (
499         (description . "Start a text spanner like 8va.....|")
500         (types . (general-music span-event event text-span-event))
501         ))
502     
503     (TrillSpanEvent
504      . (
505         (description . "Start a trill spanner tr~~~")
506         (types . (general-music span-event event trill-span-event))
507         ))
508     
509     (TransposedMusic
510      . (
511         (description .  "Music that has been transposed.")
512         (iterator-ctor . ,ly:music-wrapper-iterator::constructor)
513         (start-callback . ,ly:music-wrapper::start-callback)
514         (length-callback . ,ly:music-wrapper::length-callback)
515         (to-relative-callback . ,ly:relative-octave-music::no-relative-callback)
516         (types . (music-wrapper-music general-music transposed-music))
517         ))
518
519     (TimeScaledMusic
520      . (
521         (description .  "Multiply durations, as in tuplets. 
522
523 Syntax @code{\\times @var{fraction} @var{music}}, e.g.
524 @code{\\times 2/3 @{ ... @}} for triplets.
525  ")
526         (length-callback . ,ly:music-wrapper::length-callback)
527         (start-callback . ,ly:music-wrapper::start-callback)
528         (iterator-ctor . ,ly:time-scaled-music-iterator::constructor)
529         (types . (time-scaled-music music-wrapper-music general-music))
530         ))
531
532     (TupletSpanEvent
533      . (
534         (description .  "Used internally to signal where tuplet brackets start and stop.")
535         (types . (tuplet-span-event span-event event general-music))
536        ))
537
538     (UnrelativableMusic
539      . (
540         (description .  "Music that can not be converted from relative to absolute notation.
541 For example, transposed music.")
542         (to-relative-callback . ,ly:relative-octave-music::no-relative-callback)
543         (iterator-ctor . ,ly:music-wrapper-iterator::constructor)
544         (length-callback . ,ly:music-wrapper::length-callback)
545         (types . (music-wrapper-music general-music unrelativable-music))
546         ))
547
548     (RelativeOctaveMusic
549      . (
550         (description .  "Music that was entered in relative octave notation.")
551         (to-relative-callback . ,ly:relative-octave-music::relative-callback)
552         (iterator-ctor . ,ly:music-wrapper-iterator::constructor)
553         (length-callback . ,ly:music-wrapper::length-callback)
554         (start-callback . ,ly:music-wrapper::start-callback)
555         (types . (music-wrapper-music general-music relative-octave-music))
556         ))
557     (ScriptEvent
558      . (
559         (description .  "Add an articulation mark to a note. ")
560
561         (types . (general-music event))
562         ))
563
564     (SkipMusic
565      . (
566         (description .  "Filler that takes up duration, does not print anything, and also
567 does not create staffs or voices implicitly.
568
569
570
571 Syntax: @code{\\skip }@var{duration}.")
572         (length-callback . ,ly:music-duration-length)
573         (iterator-ctor . ,ly:simple-music-iterator::constructor)
574         (types . (general-music event rhythmic-event skip-event))
575         ))
576     
577     (SkipEvent
578      . (
579         (description .  "Filler that takes up duration, but does not print anything.
580
581
582
583 Syntax: @code{s}@var{duration}")
584
585         (types . (general-music event rhythmic-event skip-event))
586         ))
587
588     (SpacingSectionEvent
589      . ((description . "Start a new spacing section")
590         (types . (general-music event spacing-section-event))))
591      
592     (SpanEvent
593      . (
594         (description .  "Event for anything that is started at a different time than stopped.")
595
596         (types . (general-music event))
597         ))
598     
599     (SustainEvent
600      . (
601         (description . "Depress or release sustain pedal. ")
602         (types . (general-music event pedal-event sustain-event))
603         ))
604     
605     (SostenutoEvent
606      . (
607         (description . "Depress or release sostenuto pedal. ")
608         (types . (general-music event pedal-event sostenuto-event))
609         ))
610     
611     (UnaCordaEvent
612      . (
613         (description . "Depress or release una-corda pedal.")
614         (types . (general-music event pedal-event una-corda-event))
615         ))
616     
617     (StringNumberEvent
618      . (
619         (description .  "Specify on which string to play this note. 
620
621 Syntax: @code{\\@var{number}}.")
622
623         (types . (general-music string-number-event event))
624         )) 
625
626     (StrokeFingerEvent
627      . (
628         (description .  "Specify with which finger to pluck a string. 
629
630 Syntax: @code{\\rightHandFinger @var{text}}.")
631
632         (types . (general-music stroke-finger-event event))
633         )) 
634     
635     (TextScriptEvent
636      . (
637         (description .  "")
638         (types . (general-music script-event text-script-event event))
639         )) 
640     (TieEvent
641      . (
642         (description .  "A tie.  Entered as @var{note}-~.")
643         (types . (general-music tie-event event))
644         ))
645     (TremoloEvent
646      . (
647         (description . "Un measured tremolo.")
648         (types . (general-music event tremolo-event))
649         ))
650     
651     (TremoloSpanEvent
652      . (
653         (description . "Tremolo over two stems")
654         (types . (general-music event span-event tremolo-span-event))
655         ))
656
657     (VoiceSeparator
658      . (
659         (description .  "Separate polyphonic voices in simultaneous music. 
660
661 Syntax: @code{\\\\}")
662
663         (types . (separator general-music))
664         ))
665
666     (VoltaRepeatedMusic
667      . (
668         (iterator-ctor . ,ly:volta-repeat-iterator::constructor)
669         (description . "")
670         (start-callback .  ,ly:repeated-music::first-start)
671         (length-callback . ,ly:repeated-music::volta-music-length)
672         (types . (general-music repeated-music volta-repeated-music))
673         ))
674     
675     (UnfoldedRepeatedMusic
676      . (
677         (iterator-ctor . ,ly:unfolded-repeat-iterator::constructor)
678         (description .  "")
679         (start-callback .  ,ly:repeated-music::first-start)
680         (types . (general-music repeated-music unfolded-repeated-music))
681         (length-callback . ,ly:repeated-music::unfolded-music-length)
682         ))
683     (PercentRepeatedMusic
684      . (
685         (description .  "Repeats encoded by percents.")
686         (iterator-ctor . ,ly:percent-repeat-iterator::constructor)
687         (start-callback .  ,ly:repeated-music::first-start)
688         (length-callback . ,ly:repeated-music::unfolded-music-length)
689         (types . (general-music repeated-music percent-repeated-music))
690         ))
691     
692     (TremoloRepeatedMusic
693      . (
694         (iterator-ctor . ,ly:chord-tremolo-iterator::constructor)
695         (description .  "Repeated notes denoted by tremolo beams.")
696         (start-callback .  ,ly:repeated-music::first-start)
697
698         ;; the length of the repeat is handled by shifting the note logs
699         (length-callback . ,ly:repeated-music::folded-music-length)
700         (types . (general-music repeated-music tremolo-repeated-music))
701         
702         ))
703     
704     (FoldedRepeatedMusic
705      . (
706         (description .  "Repeats with alternatives placed in parallel. ")
707         (iterator-ctor  . ,ly:folded-repeat-iterator::constructor)
708         (start-callback .  ,ly:repeated-music::minimum-start)
709         (length-callback . ,ly:repeated-music::folded-music-length)
710         (types . (general-music repeated-music folded-repeated-music))
711         ))
712     ))
713
714 (set! music-descriptions
715       (sort music-descriptions alist<?))
716
717 (define-public music-name-to-property-table (make-vector 59 '()))
718
719 ;; init hash table,
720 ;; transport description to an object property.
721 (set!
722  music-descriptions
723  (map (lambda (x)
724         (set-object-property! (car x)
725                               'music-description
726                               (cdr (assq 'description (cdr x))))
727         (let ((lst (cdr x)))
728           (set! lst (assoc-set! lst 'name (car x)))
729           (set! lst (assq-remove! lst 'description))
730           (hashq-set! music-name-to-property-table (car x) lst)
731           (cons (car x) lst)))
732       music-descriptions))
733
734 (define-safe-public (make-music name . music-properties)
735   "Create a music object of given name, and set its properties
736 according to `music-properties', a list of alterning property symbols
737 and values. E.g:
738   (make-music 'OverrideProperty 
739               'symbol 'Stem
740               'grob-property 'thickness
741               'grob-value (* 2 1.5))"
742   (if (not (symbol? name))
743       (ly:error (_ "symbol expected: ~S") name))
744   (let ((props (hashq-ref music-name-to-property-table name '())))
745     (if (not (pair? props))
746         (ly:error (_ "cannot find music object: ~S") name))
747     (let ((m (ly:make-music props)))
748       (define (set-props mus-props)
749         (if (and (not (null? mus-props))
750                  (not (null? (cdr mus-props))))
751             (begin
752               (set! (ly:music-property m (car mus-props)) (cadr mus-props))
753               (set-props (cddr mus-props)))))
754       (set-props music-properties)
755       m)))
756
757 (define-public (make-repeated-music name)
758   (let* ((handle (assoc name '(("volta" . VoltaRepeatedMusic)
759                                ("unfold" . UnfoldedRepeatedMusic)
760                                ("percent" . PercentRepeatedMusic)
761                                ("tremolo" . TremoloRepeatedMusic)
762                                ("fold" . FoldedRepeatedMusic))))
763          (music-name (if (pair? handle)
764                          (cdr handle)
765                          (begin
766                            (ly:warning (_ "unknown repeat type `~S'") name)
767                            (ly:warning (_ "See music-types.scm for supported repeats"))
768                            'VoltaRepeatedMusic))))
769     (make-music music-name)))
770