X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=lily%2Finclude%2Fsequential-music-iterator.hh;h=62a251e22f4dc278abac992628be283dce8174c1;hb=d9b43b93f2c885409bafdb157138158f65cc49aa;hp=8cf39854c840dec1b9f929545a1b2016325d60ae;hpb=2b3853cd624f78756ba0f891fe220776a496d288;p=lilypond.git diff --git a/lily/include/sequential-music-iterator.hh b/lily/include/sequential-music-iterator.hh index 8cf39854c8..62a251e22f 100644 --- a/lily/include/sequential-music-iterator.hh +++ b/lily/include/sequential-music-iterator.hh @@ -3,45 +3,79 @@ source file of the GNU LilyPond music typesetter - (c) 1997--1998 Han-Wen Nienhuys + (c) 1997--2002 Han-Wen Nienhuys */ #ifndef SEQUENTIAL_MUSIC_ITERATOR_HH #define SEQUENTIAL_MUSIC_ITERATOR_HH -#include "music-list-iterator.hh" +#include "music-iterator.hh" + + +/* + + This is a lookahead list for grace notes. + + { ... X \grace Y Z ... } + + normally, the ending of X is the start of Z. In case of a grace + note, we take off a little at the end of X. What is stored: START + (start point of X), LENGTH (length of X), GRACE_START (start_music + of Y), and the next fixup element. + + This is also done for nested musics, i.e. + + voiceA = \notes { \grace b16 c'2 } + voiceB = \notes { c'2 \voiceA } + + the iterator for voiceB will contain a fixup entry with (START=0/1, + LENGTH=2/1, GRACE_START=(0G-1/16) ) + + Graces at the start of a sequential music iterator are handled + by initting here_mom_ with Music::start_music (); no fixups are needed. + +*/ +struct Grace_fixup +{ + Moment start_; + Moment length_; + + Rational grace_start_; + Grace_fixup *next_; +}; /** Sequential_music iteration: walk each element in turn, and construct an iterator for every element. */ -class Sequential_music_iterator : public Music_list_iterator +class Sequential_music_iterator : public Music_iterator { public: + Grace_fixup * grace_fixups_; + + VIRTUAL_COPY_CONS (Music_iterator); + static SCM constructor_cxx_function; Sequential_music_iterator (); + Sequential_music_iterator (Sequential_music_iterator const&); virtual ~Sequential_music_iterator (); virtual void construct_children (); - virtual Moment next_moment () const; + virtual Moment pending_moment () const; virtual bool ok () const; + virtual void skip (Moment); + virtual SCM get_music (Moment)const; protected: - Sequential_music* sequential_music_l () const; - - virtual void do_print() const; - virtual void do_process_and_next (Moment); + virtual void process (Moment); + virtual Music_iterator *try_music_in_children (Music *) const; private: Moment here_mom_; - PCursor *cursor_p_; + SCM cursor_; Music_iterator * iter_p_; - /* - perhaps these can be virtual and protected iso. private? - */ - void start_next_element(); - void leave_element(); - void set_Sequential_music_translator(); + void next_element (); + void descend_to_child (); }; #endif // SEQUENTIAL_MUSIC_ITERATOR_HH