]> git.donarmstrong.com Git - lilypond.git/blob - lily/music-list.cc
5642127ff3995773a2e5491878481154a27a0484
[lilypond.git] / lily / music-list.cc
1 /*
2   music-list.cc -- implement Music_list, Chord, Voice
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 #include <limits.h>
11 #include "music.hh"
12 #include "debug.hh"
13 #include "music-list.hh"
14 #include "musical-pitch.hh"
15 #include "request.hh"
16 #include "musical-request.hh"
17
18 Music_list::Music_list (Music_list const&s)
19   : Music (s)
20 {
21   multi_level_i_ = s.multi_level_i_;   
22   for (iter (s.music_p_list_.top(), i); i.ok (); i++)
23     add (i->clone());
24 }
25
26 IMPLEMENT_IS_TYPE_B1(Music_list, Music);
27 IMPLEMENT_IS_TYPE_B1(Voice,Music_list);
28 IMPLEMENT_IS_TYPE_B1(Chord,Music_list);
29
30 MInterval
31 Chord::time_int() const
32 {
33   MInterval m;
34   for (iter (music_p_list_.top(), i); i.ok (); i++)
35     m.unite (i->time_int());
36
37   return m;
38 }
39
40 void
41 Chord::translate (Moment m)
42 {
43   for (iter (music_p_list_.top(), i); i.ok (); i++)
44     i->translate (m); 
45 }
46
47 Chord::Chord()
48 {
49
50 }
51
52 Voice::Voice()
53 {
54   offset_mom_ =0;
55 }
56
57 MInterval
58 Voice::time_int() const
59 {
60   Moment last=0;
61   for (iter (music_p_list_.top(), i); i.ok (); i++) 
62     {
63       MInterval interval = i->time_int();
64         
65       /*
66         c4 <> c4
67       */
68       if (!interval.empty_b())
69         last += interval.length();
70     }
71   return  offset_mom_ + MInterval (0,last);
72 }
73
74 Musical_pitch
75 Voice::to_relative_octave (Musical_pitch p)
76 {
77   return do_relative_octave (p, false);
78 }
79
80 Musical_pitch
81 Chord::to_relative_octave (Musical_pitch p)
82 {
83   return do_relative_octave (p, true);
84 }
85
86 void
87 Voice::translate (Moment dt)
88 {
89   offset_mom_ += dt;
90 }
91
92
93 Music_list::Music_list()
94 {
95   multi_level_i_ = 0;
96 }
97
98 void
99 Music_list::add (Music*m_p)
100 {
101   if (!m_p)
102     return;
103
104   m_p->parent_music_l_ = this;
105   music_p_list_.bottom().add (m_p);
106 }
107
108 void
109 Music_list::transpose (Musical_pitch rq)
110 {
111   for (iter (music_p_list_.top(),i); i.ok (); i++)
112     i->transpose (rq);    
113 }
114
115 void
116 Music_list::do_print() const
117 {
118 #ifndef NPRINT
119   for (iter (music_p_list_.top(),i); i.ok (); i++)
120     i->print();
121 #endif 
122 }
123
124 IMPLEMENT_IS_TYPE_B1(Request_chord, Chord);
125
126
127 Request_chord::Request_chord()
128 {
129   multi_level_i_ =0;
130 }
131
132
133 Musical_pitch 
134 Music_list::do_relative_octave (Musical_pitch last, bool ret_first)
135 {
136
137   Musical_pitch retval;
138   int count=0;
139   for (iter (music_p_list_.top(),i); i.ok (); i++)
140     {
141       last = i->to_relative_octave (last);
142       if (!count ++ )
143         retval = last;
144     }
145   if (!ret_first)
146     retval = last;
147   return retval;
148 }
149
150 Musical_pitch
151 Request_chord::to_relative_octave (Musical_pitch last)
152 {
153   for (iter (music_p_list_.top(),i); i.ok (); i++)
154     {
155       Musical_req *m =((Request*)i.ptr ())->access_Musical_req ();
156       if (m && m->access_Melodic_req ())
157         {         
158           Musical_pitch &pit = m->access_Melodic_req ()->pitch_;
159           pit.to_relative_octave (last);
160           return pit;
161         }
162     }
163   return last;
164 }
165
166