]> git.donarmstrong.com Git - lilypond.git/blob - lily/music-list.cc
release: 1.0.8
[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 MInterval
21 Simultaneous_music::time_int() const
22 {
23   MInterval m;
24   for (iter (music_p_list_p_->top(), i); i.ok (); i++)
25     m.unite (i->time_int());
26
27   return m;
28 }
29
30 void
31 Simultaneous_music::translate (Moment m)
32 {
33   for (iter (music_p_list_p_->top(), i); i.ok (); i++)
34     i->translate (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   offset_mom_ =0;
47 }
48
49 MInterval
50 Sequential_music::time_int() const
51 {
52   Moment last=0;
53   for (iter (music_p_list_p_->top(), i); i.ok (); i++) 
54     {
55       MInterval interval = i->time_int();
56         
57       /*
58         c4 <> c4
59       */
60       if (!interval.empty_b())
61         last += interval.length();
62     }
63   return  offset_mom_ + MInterval (0,last);
64 }
65
66 Musical_pitch
67 Sequential_music::to_relative_octave (Musical_pitch p)
68 {
69   return music_p_list_p_->do_relative_octave (p, false);
70 }
71
72 Musical_pitch
73 Simultaneous_music::to_relative_octave (Musical_pitch p)
74 {
75   return music_p_list_p_->do_relative_octave (p, true);
76 }
77
78 void
79 Sequential_music::translate (Moment dt)
80 {
81   offset_mom_ += dt;
82 }
83
84
85
86
87 Musical_pitch 
88 Music_list::do_relative_octave (Musical_pitch last, bool ret_first)
89 {
90   Musical_pitch retval;
91   int count=0;
92   for (PCursor<Music*> i (top ()); i.ok (); i++)
93     {
94       last = i->to_relative_octave (last);
95       if (!count ++ )
96         retval = last;
97     }
98   if (!ret_first)
99     retval = last;
100   return retval;
101 }
102
103
104 Music_list::Music_list (Music_list const &s)
105   : Pointer_list<Music*> (s)
106 {
107   for (PCursor<Music*> i(s.top()); i.ok (); i++)
108     add_music (i->clone());
109 }
110
111 void
112 Music_list::add_music (Music*m_p)
113 {
114   if (!m_p)
115     return;
116
117   bottom().add (m_p);
118 }
119
120
121 IMPLEMENT_IS_TYPE_B1(Request_chord, Simultaneous_music);
122
123
124 Request_chord::Request_chord()
125   : Simultaneous_music (new Music_list)
126 {
127   multi_level_i_ =0;
128 }
129
130
131 Musical_pitch
132 Request_chord::to_relative_octave (Musical_pitch last)
133 {
134   for (iter (music_p_list_p_->top(),i); i.ok (); i++)
135     {
136       Musical_req *m =((Request*)i.ptr ())->access_Musical_req ();
137       if (m && m->access_Melodic_req ())
138         {         
139           Musical_pitch &pit = m->access_Melodic_req ()->pitch_;
140           pit.to_relative_octave (last);
141           return pit;
142         }
143     }
144   return last;
145 }
146
147
148 Music_list::Music_list ()
149 {
150 }