]> git.donarmstrong.com Git - lilypond.git/blob - lily/music-sequence.cc
release: 1.5.6
[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 = gh_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 = gh_cdr (s))
63     unsmob_music (gh_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 = gh_cdr (s))
76     {
77       Moment l = unsmob_music (gh_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   cumulative += - first_start ();
90   
91   return  cumulative;
92 }
93
94 Pitch
95 Music_sequence::to_relative_octave (Pitch p)
96 {
97   return do_relative_octave (p, false);
98 }
99
100
101 Moment
102 Music_sequence::maximum_length () const
103 {
104   Moment dur = 0;
105   for (SCM s = music_list (); gh_pair_p (s);  s = gh_cdr (s))
106     {
107       Music * m = unsmob_music (gh_car (s));
108       Moment l = m->length_mom () + m->start_mom ();
109       dur = dur >? l;
110     }
111
112   dur -= minimum_start ();
113   
114   return dur;
115 }
116 int
117 Music_sequence::length_i () const
118 {
119   return scm_ilength (music_list ());
120 }
121
122 Pitch
123 Music_sequence::do_relative_octave (Pitch p, bool ret_first)
124 {
125   Pitch retval;
126   int count=0;
127
128   Pitch last = p;
129   for (SCM s = music_list (); gh_pair_p (s);  s = gh_cdr (s))
130     {
131       last = unsmob_music (gh_car (s))->to_relative_octave (last);
132       if (!count ++)
133         retval = last;
134     }
135
136   if (!ret_first)
137     retval = last;
138   
139   return retval;
140 }
141
142 void
143 Music_sequence::compress (Moment m)
144 {
145   for (SCM s = music_list (); gh_pair_p (s);  s = gh_cdr (s))
146     unsmob_music (gh_car (s))->compress (m);
147 }
148
149 ADD_MUSIC (Music_sequence);
150
151 Music_sequence::Music_sequence ()
152   : Music (SCM_EOL)
153 {
154   
155 }
156
157 Moment
158 Music_sequence::minimum_start () const
159 {
160   Moment m;
161   
162   for (SCM s = music_list (); gh_pair_p (s);  s = gh_cdr (s))
163     {
164       m = m <? unsmob_music (gh_car (s))->start_mom ();
165     }
166   return m;
167 }
168
169 Moment
170 Music_sequence::first_start () const
171 {
172   Moment m;
173   
174   for (SCM s = music_list (); gh_pair_p (s);  s = gh_cdr (s))
175     {
176       Music * mus = unsmob_music (gh_car (s));
177       Moment l = mus->length_mom ();
178
179       if (l.main_part_)
180         return mus->start_mom ();
181       else if (l.grace_part_)
182         {
183           m.grace_part_ = - l.grace_part_; 
184           return m;
185         }
186     }
187   return m;
188 }
189