]> git.donarmstrong.com Git - lilypond.git/blob - lily/music-sequence.cc
* lily/include/music.hh (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 Pitch
70 music_list_to_relative (SCM l,Pitch p, bool ret_first)
71 {
72   Pitch first = p;
73   int count = 0;
74
75   Pitch last = p;
76   for (SCM s = l; scm_is_pair (s);  s = scm_cdr (s))
77     {
78       if (Music *m = unsmob_music (scm_car (s)))
79         {
80           last = m->to_relative_octave (last);
81           if (!count ++)
82             first = last;
83         }
84     }
85
86   return  (ret_first)?  first : last;
87 }
88
89
90 void
91 compress_music_list (SCM l, Moment m)
92 {
93   for (SCM s = l; scm_is_pair (s);  s = scm_cdr (s))
94     unsmob_music (scm_car (s))->compress (m);
95 }
96
97 ADD_MUSIC (Music_sequence);
98
99 Moment
100 Music_sequence::minimum_start (SCM l)
101 {
102   Moment m;
103   
104   for (SCM s = l; scm_is_pair (s);  s = scm_cdr (s))
105     {
106       m = m <? unsmob_music (scm_car (s))->start_mom ();
107     }
108   return m;
109 }
110
111 Moment
112 Music_sequence::first_start (SCM l) 
113 {
114   Moment m;
115   
116   for (SCM s = l; scm_is_pair (s);  s = scm_cdr (s))
117     {
118       Music * mus = unsmob_music (scm_car (s));
119       Moment l = mus->get_length ();
120       Moment s = mus->start_mom ();
121       if (l.to_bool () || s.to_bool ())
122         return s;
123     }
124   return m;
125 }
126