]> git.donarmstrong.com Git - lilypond.git/blob - lily/music-sequence.cc
* lily/include/music.hh (class Music): replace Music::start_mom()
[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--2004 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 Music_sequence::Music_sequence (SCM x)
15   : Music (x)
16 {
17 }
18
19 SCM
20 Music_sequence::music_list () const
21 {
22   return get_property ("elements");
23 }
24
25 void
26 transpose_music_list (SCM lst, Pitch rq)
27 {
28   for (SCM s = lst; scm_is_pair (s);  s = scm_cdr (s))
29     unsmob_music (scm_car (s))->transpose (rq);    
30 }
31
32 Moment
33 Music_sequence::cumulative_length (SCM l) 
34 {
35   Moment cumulative;
36   Moment last_len; 
37
38   for (SCM s = l; scm_is_pair (s);  s = scm_cdr (s))
39     {
40       Moment l = unsmob_music (scm_car (s))->get_length ();
41       if (last_len.grace_part_ && l.main_part_)
42         {
43           last_len.grace_part_ = Rational (0);
44         }
45       cumulative += last_len;
46       last_len = l;
47     }
48
49   last_len.grace_part_ = Rational (0);
50   cumulative += last_len;
51
52   return  cumulative;
53 }
54
55 Moment
56 Music_sequence::maximum_length (SCM l)
57 {
58   Moment dur = 0;
59   for (SCM s = l; scm_is_pair (s);  s = scm_cdr (s))
60     {
61       Music * m = unsmob_music (scm_car (s));
62       Moment l = m->get_length ();
63       dur = dur >? l;
64     }
65
66   return dur;
67 }
68
69 MAKE_SCHEME_CALLBACK(Music_sequence,maximum_length_callback,1);
70 SCM
71 Music_sequence::maximum_length_callback (SCM m)
72 {
73   Music* me = unsmob_music (m);
74   return maximum_length (me->get_property ("elements")).smobbed_copy();
75 }
76
77 MAKE_SCHEME_CALLBACK(Music_sequence,cumulative_length_callback,1);
78 SCM
79 Music_sequence::cumulative_length_callback (SCM m)
80 {
81   Music* me = unsmob_music (m);
82   return cumulative_length (me->get_property ("elements")).smobbed_copy();
83 }
84
85
86 MAKE_SCHEME_CALLBACK(Music_sequence,minimum_start_callback,1);
87 SCM
88 Music_sequence::minimum_start_callback (SCM m)
89 {
90   Music* me = unsmob_music (m);
91   return minimum_start (me->get_property ("elements")).smobbed_copy();
92 }
93
94 MAKE_SCHEME_CALLBACK(Music_sequence,first_start_callback,1);
95 SCM
96 Music_sequence::first_start_callback (SCM m)
97 {
98   Music* me = unsmob_music (m);
99   return first_start (me->get_property ("elements")).smobbed_copy();
100 }
101
102 Pitch
103 music_list_to_relative (SCM l,Pitch p, bool ret_first)
104 {
105   Pitch first = p;
106   int count = 0;
107
108   Pitch last = p;
109   for (SCM s = l; scm_is_pair (s);  s = scm_cdr (s))
110     {
111       if (Music *m = unsmob_music (scm_car (s)))
112         {
113           last = m->to_relative_octave (last);
114           if (!count ++)
115             first = last;
116         }
117     }
118
119   return  (ret_first)?  first : last;
120 }
121
122
123 void
124 compress_music_list (SCM l, Moment m)
125 {
126   for (SCM s = l; scm_is_pair (s);  s = scm_cdr (s))
127     unsmob_music (scm_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; scm_is_pair (s);  s = scm_cdr (s))
138     {
139       m = m <? unsmob_music (scm_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; scm_is_pair (s);  s = scm_cdr (s))
150     {
151       Music * mus = unsmob_music (scm_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
160