]> git.donarmstrong.com Git - lilypond.git/blob - lily/music-list.cc
d6fe224a9cef7471389e5e798f8b8a454e00fc7a
[lilypond.git] / lily / music-list.cc
1 /*
2   music-list.cc -- implement Music_sequence, Simultaneous_music, Sequential_music
3
4   source file of the GNU LilyPond music typesetter
5
6   (c)  1997--1998 Han-Wen Nienhuys <hanwen@cs.uu.nl>
7 */
8
9
10
11 #include "music-list.hh"
12 #include "musical-pitch.hh"
13 #include "request.hh"
14 #include "musical-request.hh"
15
16
17
18
19
20 Moment
21 Simultaneous_music::duration () const
22 {
23   Moment dur = 0;
24   for (iter (music_p_list_p_->top(), i); i.ok (); i++)
25     dur = dur >? i->duration ();
26
27   return dur;
28 }
29
30 void
31 Music_sequence::compress (Moment m)
32 {
33   for (PCursor<Music*>  i(music_p_list_p_->top()); i.ok (); i++)
34     i->compress (m);
35 }
36
37 Simultaneous_music::Simultaneous_music(Music_list *p)
38   : Music_sequence (p)
39 {
40
41 }
42
43 Sequential_music::Sequential_music(Music_list *p)
44   : Music_sequence (p)
45 {
46 }
47
48 Moment
49 Sequential_music::duration () const
50 {
51   Moment last=0;
52   for (iter (music_p_list_p_->top(), i); i.ok (); i++) 
53     {
54       last += i->duration ();
55     }
56   return  last;
57 }
58
59 Musical_pitch
60 Sequential_music::to_relative_octave (Musical_pitch p)
61 {
62   return do_relative_octave (p, false);
63 }
64
65 Musical_pitch
66 Simultaneous_music::to_relative_octave (Musical_pitch p)
67 {
68   return do_relative_octave (p, true);
69 }
70
71 Musical_pitch
72 Music_sequence::do_relative_octave (Musical_pitch p, bool b)
73 {
74   return music_p_list_p_->do_relative_octave (p, b);  
75 }
76
77 Musical_pitch 
78 Music_list::do_relative_octave (Musical_pitch last, bool ret_first)
79 {
80   Musical_pitch retval;
81   int count=0;
82   for (PCursor<Music*> i (top ()); i.ok (); i++)
83     {
84       last = i->to_relative_octave (last);
85       if (!count ++ )
86         retval = last;
87     }
88   if (!ret_first)
89     retval = last;
90   return retval;
91 }
92
93
94 Music_list::Music_list (Music_list const &s)
95   : Pointer_list<Music*> ()
96 {
97   for (PCursor<Music*> i(s.top()); i.ok (); i++)
98     add_music (i->clone());
99 }
100
101 void
102 Music_list::add_music (Music*m_p)
103 {
104   if (!m_p)
105     return;
106
107   bottom().add (m_p);
108 }
109
110
111
112
113
114 Request_chord::Request_chord()
115   : Simultaneous_music (new Music_list)
116 {
117 }
118
119
120 Musical_pitch
121 Request_chord::to_relative_octave (Musical_pitch last)
122 {
123   for (iter (music_p_list_p_->top(),i); i.ok (); i++)
124     {
125       if (Melodic_req *m= dynamic_cast <Melodic_req *> (i.ptr ()))
126         {
127           Musical_pitch &pit = m->pitch_;
128           pit.to_relative_octave (last);
129           return pit;
130         }
131     }
132   return last;
133 }
134
135
136 Music_list::Music_list ()
137   : Pointer_list<Music*> ()
138 {
139 }