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