source file of the GNU LilyPond music typesetter
- (c) 1998 Jan Nieuwenhuizen <janneke@gnu.org>
+ (c) 1999--2003 Han-Wen Nienhuys <hanwen@cs.uu.nl>
*/
-#ifndef REPEATED_MUSIC_HH
-#define REPEATED_MUSIC_HH
+#ifndef RepEATED_MUSIC_HH
+#define RepEATED_MUSIC_HH
+
+#include "music.hh"
-#include "music-list.hh"
/**
- Repeats and voltas
- */
+ Musical repeats.
+
+ A repeat, when played has the form of BODY A BODY B BODY C.
+
+ In this examples, the list {A B C} is put in ALTERNATIVES_P_. BODY
+ is put in REPEAT_BODY_P_. Either the body or the alternative may
+ be omitted.
+
+ There are three modes of representing this music:
+
+ BODY A
+ B
+ C
+
+ is called "folded". Mostly used for lyrics.
+
+
+ BODY A B C
+
+ is called volta. This is common notation
+
+ BODY A BODY B BODY C
+
+ is called unfolded. Useful for MIDI.
+
+ If the number of repeats is smaller than the number of alternatives, then
+ the excess alternatives are ignored for all timing purposes.
+
+ If the number of repeats is bigger than the number of alternatives, then
+ the first alternative is assumed to be repeated.
+
+*/
class Repeated_music : public Music
{
public:
- int repeats_i_;
- Music_wrapper* repeat_p_;
- Sequential_music* alternative_p_;
+ Music * body () const;
+ SCM alternatives () const;
- Repeated_music (Music_wrapper *, int n, Sequential_music*);
- Repeated_music (Repeated_music const& s);
- virtual ~Repeated_music ();
-
- virtual void do_print () const;
- virtual void transpose (Musical_pitch p);
- virtual Moment duration () const;
+ /// how often do we repeat?
+ int repeat_count ( ) const;
+ virtual Pitch to_relative_octave (Pitch);
- VIRTUAL_COPY_CONS(Music);
+ Moment body_get_length () const;
+ Moment alternatives_get_length (bool fold) const;
+ Moment alternatives_volta_get_length () const;
+
+ DECLARE_SCHEME_CALLBACK (unfolded_music_length, (SCM));
+ DECLARE_SCHEME_CALLBACK (volta_music_length, (SCM));
+ DECLARE_SCHEME_CALLBACK (folded_music_length, (SCM));
+ DECLARE_SCHEME_CALLBACK (minimum_start, (SCM));
+ DECLARE_SCHEME_CALLBACK (first_start, (SCM));
+
+ VIRTUAL_COPY_CONS (Music);
+ Repeated_music ();
+ Repeated_music (SCM);
};
-#endif /* REPEATED_MUSIC_HH */
+#endif /* RepEATED_MUSIC_HH */