X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=lily%2Fmusic-sequence.cc;h=5ce5b1a8b9baeff18e7f72929cfe73471bfb2a41;hb=a478e5ad057eaf795f915e2b31293e947364d41d;hp=6f50bd56b7471dcb02d0fc5294be996a14c78e3f;hpb=74e65211d6cda3818a6d4891f1f1c31f457e94cd;p=lilypond.git diff --git a/lily/music-sequence.cc b/lily/music-sequence.cc index 6f50bd56b7..5ce5b1a8b9 100644 --- a/lily/music-sequence.cc +++ b/lily/music-sequence.cc @@ -3,45 +3,123 @@ source file of the GNU LilyPond music typesetter - (c) 1998--1999 Han-Wen Nienhuys + (c) 1998--2000 Han-Wen Nienhuys */ #include "music-list.hh" #include "debug.hh" -#include "musical-pitch.hh" +#include "pitch.hh" -Music_sequence::Music_sequence (Music_sequence const&s) - : Music (s) + +void +Music_sequence::truncate (int k) { - music_p_list_p_ = new Music_list (*s.music_p_list_p_); + SCM l = get_mus_property ("elements"); + if (k == 0) + { + l = SCM_EOL; + } + else + { + SCM s = l; + k--; + for (; gh_pair_p (s) && k--; s = gh_cdr (s)) + ; + + if (gh_pair_p (s)) + { + gh_set_cdr_x (s, SCM_EOL); + } + } + set_mus_property ("elements", l); } +SCM +Music_sequence::music_list ()const +{ + return get_mus_property ("elements"); +} +/* + Ugh this sucks. Linear. do not use. + */ +void +Music_sequence::append_music (Music *m) +{ + set_mus_property ("elements", + gh_append2( music_list(), gh_cons (m->self_scm (), SCM_EOL))); + scm_unprotect_object (m->self_scm ()); +} -Music_sequence::Music_sequence(Music_list *mlist_p) +Music_sequence::Music_sequence(SCM l) + : Music (l) { - music_p_list_p_ = mlist_p; } void -Music_sequence::transpose (Musical_pitch rq) +Music_sequence::transpose (Pitch rq) { - for (Cons *i = music_p_list_p_->head_; i; i = i->next_) - i->car_->transpose (rq); + for (SCM s = music_list (); gh_pair_p (s); s = gh_cdr (s)) + unsmob_music (gh_car (s))->transpose (rq); } -void -Music_sequence::do_print() const + + + +Moment +Music_sequence::cumulative_length () const +{ + Moment last=0; + for (SCM s = music_list (); gh_pair_p (s); s = gh_cdr (s)) + last += unsmob_music (gh_car (s))->length_mom (); + return last; +} + +Pitch +Music_sequence::to_relative_octave (Pitch p) +{ + return do_relative_octave (p, false); +} + + +Moment +Music_sequence::maximum_length () const +{ + Moment dur = 0; + for (SCM s = music_list (); gh_pair_p (s); s = gh_cdr (s)) + dur = dur >? unsmob_music (gh_car (s))->length_mom (); + + return dur; +} +int +Music_sequence::length_i () const { -#ifndef NPRINT - for (Cons *i = music_p_list_p_->head_; i; i = i->next_) - i->car_->print(); -#endif + return scm_ilength (music_list ()); } +Pitch +Music_sequence::do_relative_octave (Pitch p, bool ret_first) +{ + Pitch retval; + int count=0; + + Pitch last = p; + for (SCM s = music_list (); gh_pair_p (s); s = gh_cdr (s)) + { + last = unsmob_music (gh_car (s))->to_relative_octave (last); + if (!count ++ ) + retval = last; + } + + if (!ret_first) + retval = last; + + return retval; +} void -Music_sequence::add_music (Music *m_p) +Music_sequence::compress (Moment m) { - music_p_list_p_->add_music (m_p); + for (SCM s = music_list (); gh_pair_p (s); s = gh_cdr (s)) + unsmob_music (gh_car (s))->compress (m); }