]> git.donarmstrong.com Git - lilypond.git/blob - lily/music-sequence.cc
5be315fcd10ffa46fa204186398b8f263a5bf563
[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 last=0;
73   for (SCM s = music_list (); gh_pair_p (s);  s = gh_cdr (s))
74     last += unsmob_music (gh_car (s))->length_mom ();
75   return  last;
76 }
77
78 Pitch
79 Music_sequence::to_relative_octave (Pitch p)
80 {
81   return do_relative_octave (p, false);
82 }
83
84
85 Moment
86 Music_sequence::maximum_length () const
87 {
88   Moment dur = 0;
89   for (SCM s = music_list (); gh_pair_p (s);  s = gh_cdr (s))
90     dur = dur >? unsmob_music (gh_car (s))->length_mom ();
91
92   return dur;
93 }
94 int
95 Music_sequence::length_i () const
96 {
97   return scm_ilength (music_list ());
98 }
99
100 Pitch
101 Music_sequence::do_relative_octave (Pitch p, bool ret_first)
102 {
103   Pitch retval;
104   int count=0;
105
106   Pitch last = p;
107   for (SCM s = music_list (); gh_pair_p (s);  s = gh_cdr (s))
108     {
109       last = unsmob_music (gh_car (s))->to_relative_octave (last);
110       if (!count ++)
111         retval = last;
112     }
113
114   if (!ret_first)
115     retval = last;
116   
117   return retval;
118 }
119
120 void
121 Music_sequence::compress (Moment m)
122 {
123   for (SCM s = music_list (); gh_pair_p (s);  s = gh_cdr (s))
124     unsmob_music (gh_car (s))->compress (m);
125 }
126
127 ADD_MUSIC (Music_sequence);
128
129 Music_sequence::Music_sequence ()
130   : Music (SCM_EOL)
131 {
132   
133 }