]> git.donarmstrong.com Git - lilypond.git/blob - lily/music-sequence.cc
(class Music): include SCM init argument.
[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 maximum_length (me->get_property ("elements")).smobbed_copy();
83 }
84
85 Pitch
86 music_list_to_relative (SCM l,Pitch p, bool ret_first)
87 {
88   Pitch first = p;
89   int count = 0;
90
91   Pitch last = p;
92   for (SCM s = l; scm_is_pair (s);  s = scm_cdr (s))
93     {
94       if (Music *m = unsmob_music (scm_car (s)))
95         {
96           last = m->to_relative_octave (last);
97           if (!count ++)
98             first = last;
99         }
100     }
101
102   return  (ret_first)?  first : last;
103 }
104
105
106 void
107 compress_music_list (SCM l, Moment m)
108 {
109   for (SCM s = l; scm_is_pair (s);  s = scm_cdr (s))
110     unsmob_music (scm_car (s))->compress (m);
111 }
112
113 ADD_MUSIC (Music_sequence);
114
115 Moment
116 Music_sequence::minimum_start (SCM l)
117 {
118   Moment m;
119   
120   for (SCM s = l; scm_is_pair (s);  s = scm_cdr (s))
121     {
122       m = m <? unsmob_music (scm_car (s))->start_mom ();
123     }
124   return m;
125 }
126
127 Moment
128 Music_sequence::first_start (SCM l) 
129 {
130   Moment m;
131   
132   for (SCM s = l; scm_is_pair (s);  s = scm_cdr (s))
133     {
134       Music * mus = unsmob_music (scm_car (s));
135       Moment l = mus->get_length ();
136       Moment s = mus->start_mom ();
137       if (l.to_bool () || s.to_bool ())
138         return s;
139     }
140   return m;
141 }
142
143