]> git.donarmstrong.com Git - lilypond.git/blob - lily/music-list.cc
7c47ded02722de0c675d8a534f2b8b57704609ac
[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 IMPLEMENT_IS_TYPE_B1(Sequential_music,Music_sequence);
18 IMPLEMENT_IS_TYPE_B1(Simultaneous_music,Music_sequence);
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 music_p_list_p_->do_relative_octave (p, false);
63 }
64
65 Musical_pitch
66 Simultaneous_music::to_relative_octave (Musical_pitch p)
67 {
68   return music_p_list_p_->do_relative_octave (p, true);
69 }
70
71
72 Musical_pitch 
73 Music_list::do_relative_octave (Musical_pitch last, bool ret_first)
74 {
75   Musical_pitch retval;
76   int count=0;
77   for (PCursor<Music*> i (top ()); i.ok (); i++)
78     {
79       last = i->to_relative_octave (last);
80       if (!count ++ )
81         retval = last;
82     }
83   if (!ret_first)
84     retval = last;
85   return retval;
86 }
87
88
89 Music_list::Music_list (Music_list const &s)
90   : Pointer_list<Music*> ()
91 {
92   for (PCursor<Music*> i(s.top()); i.ok (); i++)
93     add_music (i->clone());
94 }
95
96 void
97 Music_list::add_music (Music*m_p)
98 {
99   if (!m_p)
100     return;
101
102   bottom().add (m_p);
103 }
104
105
106 IMPLEMENT_IS_TYPE_B1(Request_chord, Simultaneous_music);
107
108
109 Request_chord::Request_chord()
110   : Simultaneous_music (new Music_list)
111 {
112   multi_level_i_ =0;
113 }
114
115
116 Musical_pitch
117 Request_chord::to_relative_octave (Musical_pitch last)
118 {
119   for (iter (music_p_list_p_->top(),i); i.ok (); i++)
120     {
121       Musical_req *m = dynamic_cast<Musical_req*> (i.ptr ());
122       if (m && dynamic_cast <Melodic_req *> (m))
123         {
124           Musical_pitch &pit = dynamic_cast <Melodic_req *> (m)->pitch_;
125           pit.to_relative_octave (last);
126           return pit;
127         }
128     }
129   return last;
130 }
131
132
133 Music_list::Music_list ()
134   : Pointer_list<Music*> ()
135 {
136 }