]> git.donarmstrong.com Git - lilypond.git/blob - lily/music-sequence.cc
release: 1.5.29
[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--2002 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 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 (SCM l)
32   : Music (l)
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))->length_mom ();
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->length_mom ();
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 retval;
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       last = unsmob_music (ly_car (s))->to_relative_octave (last);
104       if (!count ++)
105         retval = last;
106     }
107
108   if (!ret_first)
109     retval = last;
110   
111   return retval;
112 }
113
114 void
115 Music_sequence::compress (Moment m)
116 {
117   compress_list (music_list (), m);
118 }
119
120 void
121 Music_sequence::compress_list (SCM l, Moment m)
122 {
123   for (SCM s = l; gh_pair_p (s);  s = ly_cdr (s))
124     unsmob_music (ly_car (s))->compress (m);
125 }
126
127 ADD_MUSIC (Music_sequence);
128
129 Music_sequence::Music_sequence ()
130   : Music (SCM_EOL)
131 {
132   
133 }
134
135 Moment
136 Music_sequence::minimum_start (SCM l)
137 {
138   Moment m;
139   
140   for (SCM s = l; gh_pair_p (s);  s = ly_cdr (s))
141     {
142       m = m <? unsmob_music (ly_car (s))->start_mom ();
143     }
144   return m;
145 }
146
147 Moment
148 Music_sequence::first_start (SCM l) 
149 {
150   Moment m;
151   
152   for (SCM s = l; gh_pair_p (s);  s = ly_cdr (s))
153     {
154       Music * mus = unsmob_music (ly_car (s));
155       Moment l = mus->length_mom ();
156       Moment s = mus->start_mom ();
157       if (l.to_bool () || s.to_bool ())
158         return s;
159     }
160   return m;
161 }
162