]> git.donarmstrong.com Git - lilypond.git/blobdiff - lily/performance.cc
release: 1.1.52
[lilypond.git] / lily / performance.cc
index 7ae2ea35bebd2862fdeba7a570924eb24b86596b..f25b63eea11c5d25175cb7bb27007667938f3202 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c)  1997--1998 Jan Nieuwenhuizen <janneke@gnu.org>
+  (c)  1997--1999 Jan Nieuwenhuizen <janneke@gnu.org>
 */
 
 #include <time.h>
 #include "performance.hh"
 #include "score.hh"
 #include "file-results.hh"
+#include "lily-version.hh"
+
+#include "killing-cons.tcc"
 
 Performance::Performance ()
 {
   midi_l_ =0;
+  audio_elem_p_list_ = 0;
 }
 
-void
-Performance::add_column (Audio_column* p)
+
+Performance::~Performance()
 {
-  p->performance_l_ = this;
-  audio_column_p_list_.bottom().add (p);
+  delete audio_elem_p_list_;
 }
 
 void
-Performance::output (Midi_stream& midi_stream_r)
+Performance::output (Midi_stream& midi_stream)
 {
-  int tracks_i = audio_staff_l_list_.size() + 1;
+  int tracks_i = audio_staff_l_arr_.size() + 1;
+
   // ugh
   int clocks_per_4_i = 384;
-  midi_stream_r << Midi_header (1, tracks_i, clocks_per_4_i);
-  output_header_track (midi_stream_r);
-  int n = 1;
-  for (PCursor<Audio_staff*> i (audio_staff_l_list_); i.ok(); i++)
-    i->output (midi_stream_r, n++);
+
+  midi_stream << Midi_header (1, tracks_i, clocks_per_4_i);
+  output_header_track (midi_stream);
+  int channel = 1;
+  for (int i =0; i < audio_staff_l_arr_.size (); i++)
+    {
+      Audio_staff *s = audio_staff_l_arr_[i];
+
+      /*
+       Aargh, let's hear it for the MIDI standard.
+       MIDI players tend to ignore instrument settings on
+       channel 10, the percussion channel by default.
+       */
+      if (channel == 9)
+       channel++;
+      s->output (midi_stream, channel++);
+    }
 }
 
 void
-Performance::output_header_track (Midi_stream& midi_stream_r)
+Performance::output_header_track (Midi_stream& midi_stream)
 {
   Midi_track midi_track;
 
   // perhaps multiple text events?
   String str = String (_("Creator: "));
   if (no_timestamps_global_b)
-    str += "GNU LilyPond\n";
+    str += gnu_lilypond_str ();
   else
-      str += get_version_str() + "\n";
+    str += gnu_lilypond_version_str();
+  str += "\n";
 
   Midi_text creator (Midi_text::TEXT, str);
   midi_track.add (Moment (0), &creator);
@@ -85,19 +102,21 @@ Performance::output_header_track (Midi_stream& midi_stream_r)
   Midi_tempo tempo (midi_l_->get_tempo_i (Moment (1, 4)));
   midi_track.add (Moment (0), &tempo);
 
-  midi_stream_r  << midi_track;
-}
-
-void
-Performance::add_staff (Audio_staff* l)
-{
-  audio_staff_l_list_.bottom().add (l);
+  midi_stream << midi_track;
 }
 
 void
 Performance::add_element (Audio_element *p)
 {
-  audio_elem_p_list_.bottom().add (p);
+  if (Audio_staff*s=dynamic_cast<Audio_staff *> (p)) 
+    {
+      audio_staff_l_arr_.push (s);
+    }
+  else if (Audio_column *c = dynamic_cast<Audio_column*>(p))
+    {
+      c->performance_l_ = this;
+    }
+  audio_elem_p_list_ = new Killing_cons<Audio_element> (p, audio_elem_p_list_);
 }
 
 void
@@ -106,13 +125,9 @@ Performance::print() const
 #ifndef NPRINT
   DOUT << "Performance { ";
   DOUT << "Items: ";
-  for (PCursor<Audio_element*> i (audio_elem_p_list_.top ()); i.ok (); i++)
-    i->print ();
-
-  DOUT << "\ncolumns: ";
-  for (PCursor<Audio_column*> i (audio_column_p_list_); i.ok(); i++)
-    i->print();
-  DOUT << "}\n";
+  for (Cons<Audio_element>* i =audio_elem_p_list_; i; i = i->next_)
+    i->car_->print ();
+  DOUT << "}";
 #endif
 }