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