]> git.donarmstrong.com Git - lilypond.git/blob - lily/music-sequence.cc
207913331444ec1b22a25159bd9934bb61924260
[lilypond.git] / lily / music-sequence.cc
1 /*   
2   music-sequence.cc --  implement Music_sequence
3   
4   source file of the GNU LilyPond music typesetter
5   
6   (c) 1998--2001 Han-Wen Nienhuys <hanwen@cs.uu.nl>
7   
8  */
9 #include "music-list.hh"
10 #include "debug.hh"
11 #include "pitch.hh"
12
13
14 void
15 Music_sequence::truncate (int k)
16 {
17   SCM l = get_mus_property ("elements");
18   if (k == 0)
19     {
20       l = SCM_EOL;
21     }
22   else
23     {
24       SCM s = l;
25       k--;
26       for (; gh_pair_p (s) && k--; s = ly_cdr (s))
27         ;
28
29       if (gh_pair_p (s))
30         {
31           gh_set_cdr_x (s, SCM_EOL);
32         }
33     }
34   set_mus_property ("elements", l);
35 }
36
37 SCM
38 Music_sequence::music_list ()const
39 {
40   return get_mus_property ("elements");
41 }
42
43 /*
44   Ugh this sucks. Linear. do not use.
45  */
46 void
47 Music_sequence::append_music (Music *m)
48 {
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 ());
52 }
53
54 Music_sequence::Music_sequence (SCM l)
55   : Music (l)
56 {
57 }
58
59 void
60 Music_sequence::transpose (Pitch rq)
61 {
62   for (SCM s = music_list (); gh_pair_p (s);  s = ly_cdr (s))
63     unsmob_music (ly_car (s))->transpose (rq);    
64 }
65
66
67
68
69 Moment
70 Music_sequence::cumulative_length () const
71 {
72   Moment cumulative;
73   
74   Moment last_len ; 
75   for (SCM s = music_list (); gh_pair_p (s);  s = ly_cdr (s))
76     {
77       Moment l = unsmob_music (ly_car (s))->length_mom ();
78       if (last_len.grace_part_ && l.main_part_)
79         {
80           last_len.grace_part_ = Rational (0);
81         }
82       cumulative += last_len;
83       last_len = l;
84     }
85
86   last_len.grace_part_ = Rational (0);
87   cumulative += last_len;
88
89   return  cumulative;
90 }
91
92 Pitch
93 Music_sequence::to_relative_octave (Pitch p)
94 {
95   return do_relative_octave (p, false);
96 }
97
98
99 Moment
100 Music_sequence::maximum_length () const
101 {
102   Moment dur = 0;
103   for (SCM s = music_list (); gh_pair_p (s);  s = ly_cdr (s))
104     {
105       Music * m = unsmob_music (ly_car (s));
106       Moment l = m->length_mom ();
107       dur = dur >? l;
108     }
109
110   return dur;
111 }
112 int
113 Music_sequence::length_i () const
114 {
115   return scm_ilength (music_list ());
116 }
117
118 Pitch
119 Music_sequence::do_relative_octave (Pitch p, bool ret_first)
120 {
121   Pitch retval;
122   int count=0;
123
124   Pitch last = p;
125   for (SCM s = music_list (); gh_pair_p (s);  s = ly_cdr (s))
126     {
127       last = unsmob_music (ly_car (s))->to_relative_octave (last);
128       if (!count ++)
129         retval = last;
130     }
131
132   if (!ret_first)
133     retval = last;
134   
135   return retval;
136 }
137
138 void
139 Music_sequence::compress (Moment m)
140 {
141   for (SCM s = music_list (); gh_pair_p (s);  s = ly_cdr (s))
142     unsmob_music (ly_car (s))->compress (m);
143 }
144
145 ADD_MUSIC (Music_sequence);
146
147 Music_sequence::Music_sequence ()
148   : Music (SCM_EOL)
149 {
150   
151 }
152
153 Moment
154 Music_sequence::minimum_start () const
155 {
156   Moment m;
157   
158   for (SCM s = music_list (); gh_pair_p (s);  s = ly_cdr (s))
159     {
160       m = m <? unsmob_music (ly_car (s))->start_mom ();
161     }
162   return m;
163 }
164
165 Moment
166 Music_sequence::first_start () const
167 {
168   Moment m;
169   
170   for (SCM s = music_list (); gh_pair_p (s);  s = ly_cdr (s))
171     {
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 ())
176         return s;
177     }
178   return m;
179 }
180