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