source file of the GNU LilyPond music typesetter
- (c) 1998--1999 Jan Nieuwenhuizen <janneke@gnu.org>
+ (c) 1999--2002 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_;
- bool unfold_b_;
- Music* repeat_p_;
- /*
- UGH FIXME: this should be:
-
- Music_list * alternative_p_;
- */
- Music_sequence* alternative_p_;
-
- Repeated_music (Music*, int n, Music_sequence*);
- Repeated_music (Repeated_music const& s);
- virtual ~Repeated_music ();
+ Music * body () const;
+ SCM alternatives () const;
+
+ /// how often do we repeat?
+ int repeat_count ( ) const;
+ virtual Pitch to_relative_octave (Pitch);
+
+ Moment body_length_mom () const;
+ Moment alternatives_length_mom (bool fold) const;
+ Moment alternatives_volta_length_mom () const;
+
+ DECLARE_SCHEME_CALLBACK (unfolded_music_length, (SCM));
+ DECLARE_SCHEME_CALLBACK (volta_music_length, (SCM));
+ DECLARE_SCHEME_CALLBACK (folded_music_length, (SCM));
- virtual void do_print () const;
- virtual void transpose (Musical_pitch p);
- virtual Moment length_mom () const;
- virtual Musical_pitch to_relative_octave (Musical_pitch p);
- VIRTUAL_COPY_CONS(Music);
+ /// Transpose, with the interval central C to #p#
+ virtual void transpose (Pitch p);
+
+ /// Scale the music in time by #factor#.
+ virtual void compress (Moment factor);
+ VIRTUAL_COPY_CONS (Music);
+ Repeated_music ();
+ Repeated_music (SCM);
};
-#endif /* REPEATED_MUSIC_HH */
+#endif /* RepEATED_MUSIC_HH */