]> git.donarmstrong.com Git - lilypond.git/blob - lily/music-list.cc
release: 1.1.14
[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 #include "music-list.hh"
10 #include "musical-pitch.hh"
11 #include "request.hh"
12 #include "musical-request.hh"
13 #include "main.hh"
14
15 Moment
16 Simultaneous_music::duration () const
17 {
18   Moment dur = 0;
19   for (iter (music_p_list_p_->top(), i); i.ok (); i++)
20     dur = dur >? i->duration ();
21
22   return dur;
23 }
24
25 void
26 Music_sequence::compress (Moment m)
27 {
28   for (PCursor<Music*>  i(music_p_list_p_->top()); i.ok (); i++)
29     i->compress (m);
30 }
31
32 Simultaneous_music::Simultaneous_music(Music_list *p)
33   : Music_sequence (p)
34 {
35
36 }
37
38 Sequential_music::Sequential_music(Music_list *p)
39   : Music_sequence (p)
40 {
41 }
42
43 Moment
44 Sequential_music::duration () const
45 {
46   Moment last=0;
47   for (iter (music_p_list_p_->top(), i); i.ok (); i++) 
48     {
49       last += i->duration ();
50     }
51   return  last;
52 }
53
54 Musical_pitch
55 Sequential_music::to_relative_octave (Musical_pitch p)
56 {
57   return do_relative_octave (p, false);
58 }
59
60 Musical_pitch
61 Simultaneous_music::to_relative_octave (Musical_pitch p)
62 {
63   return do_relative_octave (p, true);
64 }
65
66 Musical_pitch
67 Music_sequence::do_relative_octave (Musical_pitch p, bool b)
68 {
69   return music_p_list_p_->do_relative_octave (p, b);  
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
84   // hmmm
85 #if 0  
86   if (!ret_first && find_old_relative_b)
87     {
88       PCursor<Music*> b (bottom ());
89
90       if (b.ok ())
91         {
92           String w = _("\\relative mode changed here, old value: ");
93           w +=  last.str ();
94
95           b->warning (w);
96           retval = last;
97         }
98     }
99   
100 #endif
101   if (!ret_first)
102     retval = last;
103   
104   return retval;
105 }
106
107
108 Music_list::Music_list (Music_list const &s)
109   : Pointer_list<Music*> ()
110 {
111   for (PCursor<Music*> i(s.top()); i.ok (); i++)
112     add_music (i->clone());
113 }
114
115 void
116 Music_list::add_music (Music*m_p)
117 {
118   if (!m_p)
119     return;
120
121   bottom().add (m_p);
122 }
123
124
125
126
127
128 Request_chord::Request_chord()
129   : Simultaneous_music (new Music_list)
130 {
131 }
132
133
134 Musical_pitch
135 Request_chord::to_relative_octave (Musical_pitch last)
136 {
137   for (iter (music_p_list_p_->top(),i); i.ok (); i++)
138     {
139       if (Melodic_req *m= dynamic_cast <Melodic_req *> (i.ptr ()))
140         {
141           Musical_pitch &pit = m->pitch_;
142           pit.to_relative_octave (last);
143           return pit;
144         }
145     }
146   return last;
147 }
148
149
150 Music_list::Music_list ()
151   : Pointer_list<Music*> ()
152 {
153 }