]> git.donarmstrong.com Git - lilypond.git/blob - lily/music-list.cc
release: 1.1.39
[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--1999 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 #include "killing-cons.tcc"
15
16 Moment
17 Simultaneous_music::length_mom () const
18 {
19   Moment dur = 0;
20   for (Cons<Music> *i = music_p_list_p_->head_; i;  i = i->next_)
21     dur = dur >? i->car_->length_mom ();
22
23   return dur;
24 }
25
26 void
27 Music_sequence::compress (Moment m)
28 {
29   for (Cons<Music> *i = music_p_list_p_->head_; i;  i = i->next_)
30     i->car_->compress (m);
31 }
32
33 Simultaneous_music::Simultaneous_music(Music_list *p)
34   : Music_sequence (p)
35 {
36
37 }
38
39 Sequential_music::Sequential_music(Music_list *p)
40   : Music_sequence (p)
41 {
42 }
43
44 Moment
45 Sequential_music::length_mom () const
46 {
47   Moment last=0;
48   for (Cons<Music> *i = music_p_list_p_->head_; i;  i = i->next_)
49     {
50       last += i->car_->length_mom ();
51     }
52   return  last;
53 }
54
55 Musical_pitch
56 Sequential_music::to_relative_octave (Musical_pitch p)
57 {
58   return do_relative_octave (p, false);
59 }
60
61 Musical_pitch
62 Simultaneous_music::to_relative_octave (Musical_pitch p)
63 {
64   return do_relative_octave (p, true);
65 }
66
67 Musical_pitch
68 Music_sequence::do_relative_octave (Musical_pitch p, bool b)
69 {
70   return music_p_list_p_->do_relative_octave (p, b);  
71 }
72
73 Musical_pitch 
74 Music_list::do_relative_octave (Musical_pitch last, bool ret_first)
75 {
76   Musical_pitch retval;
77   int count=0;
78   for (Cons<Music> *i = head_; i ; i = i->next_)
79     {
80       last = i->car_->to_relative_octave (last);
81       if (!count ++ )
82         retval = last;
83     }
84
85   if (!ret_first)
86     retval = last;
87   
88   return retval;
89 }
90
91
92 Music_list::Music_list (Music_list const &s)
93   : Cons_list<Music> (s)
94 {
95   init_list ();
96   clone_killing_cons_list (*this, s.head_);
97 }
98
99
100 void
101 Music_list::add_music (Music*m_p)
102 {
103   if (!m_p)
104     return;
105
106   append (new Killing_cons<Music> (m_p, 0));
107 }
108
109 Request_chord::Request_chord()
110   : Simultaneous_music (new Music_list)
111 {
112 }
113
114
115 Musical_pitch
116 Request_chord::to_relative_octave (Musical_pitch last)
117 {
118   for (Cons<Music> *i = music_p_list_p_->head_; i ; i = i->next_)
119     {
120       if (Melodic_req *m= dynamic_cast <Melodic_req *> (i->car_))
121         {
122           Musical_pitch &pit = m->pitch_;
123           pit.to_relative_octave (last);
124           return pit;
125         }
126     }
127   return last;
128 }
129
130
131 Music_list::Music_list ()
132 {
133 }