2 music-sequence.cc -- implement Music_sequence
4 source file of the GNU LilyPond music typesetter
6 (c) 1998--2001 Han-Wen Nienhuys <hanwen@cs.uu.nl>
9 #include "music-list.hh"
15 Music_sequence::truncate (int k)
17 SCM l = get_mus_property ("elements");
26 for (; gh_pair_p (s) && k--; s = ly_cdr (s))
31 gh_set_cdr_x (s, SCM_EOL);
34 set_mus_property ("elements", l);
38 Music_sequence::music_list ()const
40 return get_mus_property ("elements");
44 Ugh this sucks. Linear. do not use.
47 Music_sequence::append_music (Music *m)
49 set_mus_property ("elements",
50 gh_append2 (music_list (), gh_cons (m->self_scm (), SCM_EOL)));
51 scm_gc_unprotect_object (m->self_scm ());
54 Music_sequence::Music_sequence (SCM l)
60 Music_sequence::transpose (Pitch rq)
62 for (SCM s = music_list (); gh_pair_p (s); s = ly_cdr (s))
63 unsmob_music (ly_car (s))->transpose (rq);
70 Music_sequence::cumulative_length () const
75 for (SCM s = music_list (); gh_pair_p (s); s = ly_cdr (s))
77 Moment l = unsmob_music (ly_car (s))->length_mom ();
78 if (last_len.grace_part_ && l.main_part_)
80 last_len.grace_part_ = Rational (0);
82 cumulative += last_len;
86 last_len.grace_part_ = Rational (0);
87 cumulative += last_len;
93 Music_sequence::to_relative_octave (Pitch p)
95 return do_relative_octave (p, false);
100 Music_sequence::maximum_length () const
103 for (SCM s = music_list (); gh_pair_p (s); s = ly_cdr (s))
105 Music * m = unsmob_music (ly_car (s));
106 Moment l = m->length_mom ();
113 Music_sequence::length_i () const
115 return scm_ilength (music_list ());
119 Music_sequence::do_relative_octave (Pitch p, bool ret_first)
125 for (SCM s = music_list (); gh_pair_p (s); s = ly_cdr (s))
127 last = unsmob_music (ly_car (s))->to_relative_octave (last);
139 Music_sequence::compress (Moment m)
141 for (SCM s = music_list (); gh_pair_p (s); s = ly_cdr (s))
142 unsmob_music (ly_car (s))->compress (m);
145 ADD_MUSIC (Music_sequence);
147 Music_sequence::Music_sequence ()
154 Music_sequence::minimum_start () const
158 for (SCM s = music_list (); gh_pair_p (s); s = ly_cdr (s))
160 m = m <? unsmob_music (ly_car (s))->start_mom ();
166 Music_sequence::first_start () const
170 for (SCM s = music_list (); gh_pair_p (s); s = ly_cdr (s))
172 Music * mus = unsmob_music (ly_car (s));
173 Moment l = mus->length_mom ();
174 Moment s = mus->start_mom ();
175 if (l.to_bool () || s.to_bool ())