]> git.donarmstrong.com Git - lilypond.git/blob - lily/music-sequence.cc
release: 1.5.0
[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--2001 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 void
15 Music_sequence::truncate (int k)
16 {
17   SCM l = get_mus_property ("elements");
18   if (k == 0)
19     {
20       l = SCM_EOL;
21     }
22   else
23     {
24       SCM s = l;
25       k--;
26       for (; gh_pair_p (s) && k--; s = gh_cdr (s))
27         ;
28
29       if (gh_pair_p (s))
30         {
31           gh_set_cdr_x (s, SCM_EOL);
32         }
33     }
34   set_mus_property ("elements", l);
35 }
36
37 SCM
38 Music_sequence::music_list ()const
39 {
40   return get_mus_property ("elements");
41 }
42
43 /*
44   Ugh this sucks. Linear. do not use.
45  */
46 void
47 Music_sequence::append_music (Music *m)
48 {
49   set_mus_property ("elements",
50                     gh_append2 (music_list (), gh_cons (m->self_scm (), SCM_EOL)));
51   scm_unprotect_object (m->self_scm ());
52 }
53
54 Music_sequence::Music_sequence (SCM l)
55   : Music (l)
56 {
57 }
58
59 void
60 Music_sequence::transpose (Pitch rq)
61 {
62   for (SCM s = music_list (); gh_pair_p (s);  s = gh_cdr (s))
63     unsmob_music (gh_car (s))->transpose (rq);    
64 }
65
66
67
68
69 Moment
70 Music_sequence::cumulative_length () const
71 {
72   Moment cumulative;
73   
74   Moment last_len ; 
75   for (SCM s = music_list (); gh_pair_p (s);  s = gh_cdr (s))
76     {
77       Moment l = unsmob_music (gh_car (s))->length_mom ();
78       if (last_len.grace_mom_ && l.main_part_)
79         {
80           last_len.grace_mom_ = Rational (0);
81         }
82       cumulative += last_len;
83       last_len = l;
84     }
85
86   last_len.grace_mom_ = Rational (0);
87   cumulative += last_len;
88   
89   return  cumulative;
90 }
91
92 Pitch
93 Music_sequence::to_relative_octave (Pitch p)
94 {
95   return do_relative_octave (p, false);
96 }
97
98
99 Moment
100 Music_sequence::maximum_length () const
101 {
102   Moment dur = 0;
103   for (SCM s = music_list (); gh_pair_p (s);  s = gh_cdr (s))
104     dur = dur >? unsmob_music (gh_car (s))->length_mom ();
105
106   return dur;
107 }
108 int
109 Music_sequence::length_i () const
110 {
111   return scm_ilength (music_list ());
112 }
113
114 Pitch
115 Music_sequence::do_relative_octave (Pitch p, bool ret_first)
116 {
117   Pitch retval;
118   int count=0;
119
120   Pitch last = p;
121   for (SCM s = music_list (); gh_pair_p (s);  s = gh_cdr (s))
122     {
123       last = unsmob_music (gh_car (s))->to_relative_octave (last);
124       if (!count ++)
125         retval = last;
126     }
127
128   if (!ret_first)
129     retval = last;
130   
131   return retval;
132 }
133
134 void
135 Music_sequence::compress (Moment m)
136 {
137   for (SCM s = music_list (); gh_pair_p (s);  s = gh_cdr (s))
138     unsmob_music (gh_car (s))->compress (m);
139 }
140
141 ADD_MUSIC (Music_sequence);
142
143 Music_sequence::Music_sequence ()
144   : Music (SCM_EOL)
145 {
146   
147 }
148
149 Moment
150 Music_sequence::minimum_start () const
151 {
152   Moment m;
153   
154   for (SCM s = music_list (); gh_pair_p (s);  s = gh_cdr (s))
155     {
156       m = m <? unsmob_music (gh_car (s))->start_mom ();
157     }
158   return m;
159 }
160
161 Moment
162 Music_sequence::first_start () const
163 {
164   Moment m;
165   
166   for (SCM s = music_list (); gh_pair_p (s);  s = gh_cdr (s))
167     {
168       Music * mus = unsmob_music (gh_car (s));
169       Moment l = mus->length_mom ();
170
171       if (l.main_part_)
172         return mus->start_mom ();
173       else if (l.grace_mom_)
174         {
175           m.grace_mom_ = - l.grace_mom_; 
176           return m;
177         }
178     }
179   return m;
180 }
181