]> git.donarmstrong.com Git - lilypond.git/blobdiff - lily/music-list.cc
release: 0.1.65
[lilypond.git] / lily / music-list.cc
index 49520966975a4796b953688357e7b18d2328a539..e6b652f9872e0f8c3c7c62a34dbb57109045705c 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 1997 Han-Wen Nienhuys <hanwen@stack.nl>
+  (c)  1997--1998 Han-Wen Nienhuys <hanwen@stack.nl>
 */
 
 
 #include "music.hh"
 #include "debug.hh"
 #include "music-list.hh"
+#include "musical-pitch.hh"
+#include "request.hh"
+#include "musical-request.hh"
 
-Music_list::Music_list(Music_list const&s)
-    : Music(s)
+Music_list::Music_list (Music_list const&s)
+  : Music (s)
 {
-    multi_level_i_ = s.multi_level_i_;   
-    for (iter(s.music_p_list_.top(), i); i.ok(); i++)
-       add(i->clone());
+  multi_level_i_ = s.multi_level_i_;   
+  for (iter (s.music_p_list_.top(), i); i.ok (); i++)
+    add (i->clone());
 }
 
 IMPLEMENT_IS_TYPE_B1(Music_list, Music);
@@ -25,19 +28,20 @@ IMPLEMENT_IS_TYPE_B1(Voice,Music_list);
 IMPLEMENT_IS_TYPE_B1(Chord,Music_list);
 
 MInterval
-Chord::time_int()const
+Chord::time_int() const
 {
-//    MInterval m( -(Real)INT_MAX, (Real)INT_MAX );
-    MInterval m( 0, 0 );
-    for (iter(music_p_list_.top(), i); i.ok(); i++)
-       m.unite(i->time_int());
-    return m;
+  MInterval m;
+  for (iter (music_p_list_.top(), i); i.ok (); i++)
+    m.unite (i->time_int());
+
+  return m;
 }
+
 void
-Chord::translate(Moment m)
+Chord::translate (Moment m)
 {
-    for (iter(music_p_list_.top(), i); i.ok(); i++)
-       i->translate(m); 
+  for (iter (music_p_list_.top(), i); i.ok (); i++)
+    i->translate (m); 
 }
 
 Chord::Chord()
@@ -47,53 +51,73 @@ Chord::Chord()
 
 Voice::Voice()
 {
-    offset_mom_ =0;
+  offset_mom_ =0;
 }
 
 MInterval
 Voice::time_int() const
 {
-    Moment last=0;
-    for (iter(music_p_list_.top(), i); i.ok(); i++)
-       last += i->time_int().length();
-    return  offset_mom_ + MInterval(0,last);
+  Moment last=0;
+  for (iter (music_p_list_.top(), i); i.ok (); i++) 
+    {
+      MInterval interval = i->time_int();
+       
+      /*
+       c4 <> c4
+      */
+      if (!interval.empty_b())
+       last += interval.length();
+    }
+  return  offset_mom_ + MInterval (0,last);
+}
+
+Musical_pitch
+Voice::to_relative_octave (Musical_pitch p)
+{
+  return do_relative_octave (p, false);
+}
+
+Musical_pitch
+Chord::to_relative_octave (Musical_pitch p)
+{
+  return do_relative_octave (p, true);
 }
 
 void
-Voice::translate(Moment dt)
+Voice::translate (Moment dt)
 {
-    offset_mom_ += dt;
+  offset_mom_ += dt;
 }
 
 
 Music_list::Music_list()
 {
-    multi_level_i_ = 0;
+  multi_level_i_ = 0;
 }
 
 void
-Music_list::add(Music*m_p)
+Music_list::add (Music*m_p)
 {
-    if (!m_p)
-       return;
+  if (!m_p)
+    return;
 
-    m_p->parent_music_l_ = this;
-    music_p_list_.bottom().add(m_p);
+  m_p->parent_music_l_ = this;
+  music_p_list_.bottom().add (m_p);
 }
 
 void
-Music_list::transpose(Melodic_req const*rq)
+Music_list::transpose (Musical_pitch rq)
 {
-    for (iter(music_p_list_.top(),i); i.ok(); i++)
-       i->transpose(rq);    
+  for (iter (music_p_list_.top(),i); i.ok (); i++)
+    i->transpose (rq);    
 }
 
 void
-Music_list::do_print()const
+Music_list::do_print() const
 {
 #ifndef NPRINT
-    for (iter(music_p_list_.top(),i); i.ok(); i++)
-       i->print();
+  for (iter (music_p_list_.top(),i); i.ok (); i++)
+    i->print();
 #endif 
 }
 
@@ -102,5 +126,41 @@ IMPLEMENT_IS_TYPE_B1(Request_chord, Chord);
 
 Request_chord::Request_chord()
 {
-    multi_level_i_ =0;
+  multi_level_i_ =0;
+}
+
+
+Musical_pitch 
+Music_list::do_relative_octave (Musical_pitch last, bool ret_first)
+{
+
+  Musical_pitch retval;
+  int count=0;
+  for (iter (music_p_list_.top(),i); i.ok (); i++)
+    {
+      last = i->to_relative_octave (last);
+      if (!count ++ )
+       retval = last;
+    }
+  if (!ret_first)
+    retval = last;
+  return retval;
 }
+
+Musical_pitch
+Request_chord::to_relative_octave (Musical_pitch last)
+{
+  for (iter (music_p_list_.top(),i); i.ok (); i++)
+    {
+      Musical_req *m =((Request*)i.ptr ())->musical ();
+      if (m && m->melodic ())
+       {         
+         Musical_pitch &pit = m->melodic()->pitch_;
+         pit.to_relative_octave (last);
+         return pit;
+       }
+    }
+  return last;
+}
+
+