+Music_iterator*
+Music_iterator::static_get_iterator_p (Music *m)
+{
+ Music_iterator * p =0;
+
+ /* It would be nice to do this decentrally, but the order of this is
+ significant. */
+ if (dynamic_cast<Request_chord *> (m))
+ p = new Request_chord_iterator;
+ else if (dynamic_cast<Lyric_combine_music *> (m))
+ p = new Lyric_combine_music_iterator;
+ else if (dynamic_cast<Simultaneous_music *> (m))
+ p = new Simultaneous_music_iterator;
+ else if (dynamic_cast<Sequential_music *> (m))
+ p = new Sequential_music_iterator;
+ else if (dynamic_cast<Translation_property *> (m))
+ p = new Property_iterator;
+ else if (dynamic_cast<Change_translator *> (m))
+ p = new Change_iterator;
+ else if (dynamic_cast<Time_scaled_music *> (m))
+ p = new Time_scaled_music_iterator;
+ else if (dynamic_cast<Grace_music *> (m))
+ p = new Grace_iterator;
+ else if (dynamic_cast<Auto_change_music *> (m))
+ p = new Auto_change_iterator;
+ else if (dynamic_cast<Part_combine_music *> (m))
+ p = new Part_combine_music_iterator;
+ else if (dynamic_cast<Music_wrapper *> (m))
+ p = new Music_wrapper_iterator;
+ else if (Repeated_music * n = dynamic_cast<Repeated_music *> (m))
+ {
+ if (n->type_ == "tremolo")
+ p = new Chord_tremolo_iterator;
+ else if (n->fold_b_)
+ p = new Folded_repeat_iterator;
+ else
+ p = new Unfolded_repeat_iterator;