]> git.donarmstrong.com Git - lilypond.git/blob - lily/music-sequence.cc
patch::: 1.3.82.hwn1
[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   scm_unprotect_object (m->self_scm ());
52 }
53
54 Music_sequence::Music_sequence(SCM h)
55 {
56   set_mus_property ("list", h);
57 }
58
59 void
60 Music_sequence::transpose (Musical_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 void
67 Music_sequence::do_print() const
68 {
69 #ifndef NPRINT
70   for (SCM s = music_list (); gh_pair_p (s);  s = gh_cdr (s))
71     unsmob_music (gh_car (s))->print();
72 #endif 
73 }
74
75
76
77 Moment
78 Music_sequence::cumulative_length () const
79 {
80   Moment last=0;
81   for (SCM s = music_list (); gh_pair_p (s);  s = gh_cdr (s))
82     last += unsmob_music (gh_car (s))->length_mom ();
83   return  last;
84 }
85
86 Musical_pitch
87 Music_sequence::to_relative_octave (Musical_pitch p)
88 {
89   return do_relative_octave (p, false);
90 }
91
92
93 Moment
94 Music_sequence::maximum_length () const
95 {
96   Moment dur = 0;
97   for (SCM s = music_list (); gh_pair_p (s);  s = gh_cdr (s))
98     dur = dur >? unsmob_music (gh_car (s))->length_mom ();
99
100   return dur;
101 }
102 int
103 Music_sequence::length_i () const
104 {
105   return scm_ilength (music_list ());
106 }
107
108 Musical_pitch
109 Music_sequence::do_relative_octave (Musical_pitch p, bool ret_first)
110 {
111   Musical_pitch retval;
112   int count=0;
113
114   Musical_pitch last = p;
115   for (SCM s = music_list (); gh_pair_p (s);  s = gh_cdr (s))
116     {
117       last = unsmob_music (gh_car (s))->to_relative_octave (last);
118       if (!count ++ )
119         retval = last;
120     }
121
122   if (!ret_first)
123     retval = last;
124   
125   return retval;
126 }
127
128 void
129 Music_sequence::compress (Moment m)
130 {
131   for (SCM s = music_list (); gh_pair_p (s);  s = gh_cdr (s))
132     unsmob_music (gh_car (s))->compress (m);
133 }