]> git.donarmstrong.com Git - lilypond.git/blob - lily/music-sequence.cc
* Documentation/index.html.in: Fix url to one big page. (backportme)
[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 ()
15   : Music ()
16 {
17 }
18
19 SCM
20 Music_sequence::music_list () const
21 {
22   return get_property ("elements");
23 }
24
25 /*
26   Ugh this sucks. Linear. do not use.
27  */
28 void
29 Music_sequence::append_music (Music *m)
30 {
31   set_property ("elements",
32                 ly_append2 (music_list (), scm_cons (m->self_scm (), SCM_EOL)));
33   scm_gc_unprotect_object (m->self_scm ());
34 }
35
36 void
37 transpose_music_list (SCM lst, Pitch rq)
38 {
39   for (SCM s = lst; scm_is_pair (s);  s = scm_cdr (s))
40     unsmob_music (scm_car (s))->transpose (rq);    
41 }
42
43 Moment
44 Music_sequence::cumulative_length (SCM l) 
45 {
46   Moment cumulative;
47   Moment last_len; 
48
49   for (SCM s = l; scm_is_pair (s);  s = scm_cdr (s))
50     {
51       Moment l = unsmob_music (scm_car (s))->get_length ();
52       if (last_len.grace_part_ && l.main_part_)
53         {
54           last_len.grace_part_ = Rational (0);
55         }
56       cumulative += last_len;
57       last_len = l;
58     }
59
60   last_len.grace_part_ = Rational (0);
61   cumulative += last_len;
62
63   return  cumulative;
64 }
65
66 Moment
67 Music_sequence::maximum_length (SCM l)
68 {
69   Moment dur = 0;
70   for (SCM s = l; scm_is_pair (s);  s = scm_cdr (s))
71     {
72       Music * m = unsmob_music (scm_car (s));
73       Moment l = m->get_length ();
74       dur = dur >? l;
75     }
76
77   return dur;
78 }
79
80 Pitch
81 music_list_to_relative (SCM l,Pitch p, bool ret_first)
82 {
83   Pitch first = p;
84   int count=0;
85
86   Pitch last = p;
87   for (SCM s = l; scm_is_pair (s);  s = scm_cdr (s))
88     {
89       if (Music *m = unsmob_music (scm_car (s)))
90         {
91           last = m->to_relative_octave (last);
92           if (!count ++)
93             first = last;
94         }
95     }
96
97   return  (ret_first)?  first : last;
98 }
99
100
101 void
102 compress_music_list (SCM l, Moment m)
103 {
104   for (SCM s = l; scm_is_pair (s);  s = scm_cdr (s))
105     unsmob_music (scm_car (s))->compress (m);
106 }
107
108 ADD_MUSIC (Music_sequence);
109
110 Moment
111 Music_sequence::minimum_start (SCM l)
112 {
113   Moment m;
114   
115   for (SCM s = l; scm_is_pair (s);  s = scm_cdr (s))
116     {
117       m = m <? unsmob_music (scm_car (s))->start_mom ();
118     }
119   return m;
120 }
121
122 Moment
123 Music_sequence::first_start (SCM l) 
124 {
125   Moment m;
126   
127   for (SCM s = l; scm_is_pair (s);  s = scm_cdr (s))
128     {
129       Music * mus = unsmob_music (scm_car (s));
130       Moment l = mus->get_length ();
131       Moment s = mus->start_mom ();
132       if (l.to_bool () || s.to_bool ())
133         return s;
134     }
135   return m;
136 }
137