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