]> git.donarmstrong.com Git - lilypond.git/blob - lily/music-sequence.cc
release: 1.3.73
[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--2000 Han-Wen Nienhuys <hanwen@cs.uu.nl>
7   
8  */
9 #include "music-list.hh"
10 #include "debug.hh"
11 #include "musical-pitch.hh"
12
13
14 void
15 Music_sequence::truncate (int k)
16 {
17   SCM l = get_mus_property ("list");
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 ("list", l);
35 }
36
37 SCM
38 Music_sequence::music_list ()const
39 {
40   return get_mus_property ("list");
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 ("list",
50                     gh_append2( music_list(), gh_cons (m->self_scm_, SCM_EOL)));
51 }
52 Music_sequence::Music_sequence(SCM h)
53 {
54   set_mus_property ("list", h);
55 }
56
57 void
58 Music_sequence::transpose (Musical_pitch rq)
59 {
60   for (SCM s = music_list (); gh_pair_p (s);  s = gh_cdr (s))
61     unsmob_music (gh_car (s))->transpose (rq);    
62 }
63
64 void
65 Music_sequence::do_print() const
66 {
67 #ifndef NPRINT
68   for (SCM s = music_list (); gh_pair_p (s);  s = gh_cdr (s))
69     unsmob_music (gh_car (s))->print();
70 #endif 
71 }
72
73
74
75 Moment
76 Music_sequence::cumulative_length () const
77 {
78   Moment last=0;
79   for (SCM s = music_list (); gh_pair_p (s);  s = gh_cdr (s))
80     last += unsmob_music (gh_car (s))->length_mom ();
81   return  last;
82 }
83
84 Musical_pitch
85 Music_sequence::to_relative_octave (Musical_pitch p)
86 {
87   return do_relative_octave (p, false);
88 }
89
90
91 Moment
92 Music_sequence::maximum_length () const
93 {
94   Moment dur = 0;
95   for (SCM s = music_list (); gh_pair_p (s);  s = gh_cdr (s))
96     dur = dur >? unsmob_music (gh_car (s))->length_mom ();
97
98   return dur;
99 }
100 int
101 Music_sequence::length_i () const
102 {
103   return scm_ilength (music_list ());
104 }
105
106 Musical_pitch
107 Music_sequence::do_relative_octave (Musical_pitch p, bool ret_first)
108 {
109   Musical_pitch retval;
110   int count=0;
111
112   Musical_pitch last = p;
113   for (SCM s = music_list (); gh_pair_p (s);  s = gh_cdr (s))
114     {
115       last = unsmob_music (gh_car (s))->to_relative_octave (last);
116       if (!count ++ )
117         retval = last;
118     }
119
120   if (!ret_first)
121     retval = last;
122   
123   return retval;
124 }
125
126 void
127 Music_sequence::compress (Moment m)
128 {
129   for (SCM s = music_list (); gh_pair_p (s);  s = gh_cdr (s))
130     unsmob_music (gh_car (s))->compress (m);
131 }