]> git.donarmstrong.com Git - lilypond.git/blobdiff - lily/performance.cc
* lily/system-start-delimiter.cc (print): allow style = text too.
[lilypond.git] / lily / performance.cc
index be168b2de052d6ff57c7a35a3d5363a431c93f46..93899350e0ca8d8bc76e009e3a05eb07acf13a06 100644 (file)
 
   source file of the GNU LilyPond music typesetter
 
 
   source file of the GNU LilyPond music typesetter
 
-  (c)  1997--2001 Jan Nieuwenhuizen <janneke@gnu.org>
+  (c) 1997--2006 Jan Nieuwenhuizen <janneke@gnu.org>
 */
 
 */
 
-#include <time.h>
-#include "debug.hh"
-#include "string.hh"
-#include "string-convert.hh"
+#include "performance.hh"
+
+#include <ctime>
+using namespace std;
+
+#include "audio-column.hh"
+#include "audio-staff.hh"
+#include "file-name.hh"
+#include "international.hh"
+#include "lily-version.hh"
 #include "main.hh"
 #include "main.hh"
-#include "midi-def.hh"
 #include "midi-item.hh"
 #include "midi-stream.hh"
 #include "midi-item.hh"
 #include "midi-stream.hh"
-#include "audio-column.hh"
-#include "audio-item.hh"
-#include "audio-staff.hh"
-#include "performance.hh"
 #include "score.hh"
 #include "score.hh"
-#include "file-results.hh"
-#include "file-path.hh"
-#include "lily-version.hh"
+#include "string-convert.hh"
+#include "warn.hh"
 
 #include "killing-cons.tcc"
 
 Performance::Performance ()
 {
 
 #include "killing-cons.tcc"
 
 Performance::Performance ()
 {
-  midi_l_ =0;
-  audio_elem_p_list_ = 0;
+  midi_ = 0;
+  audio_element_list_ = 0;
 }
 
 }
 
-
 Performance::~Performance ()
 {
 Performance::~Performance ()
 {
-  delete audio_elem_p_list_;
+  delete audio_element_list_;
 }
 
 void
 }
 
 void
-Performance::output (Midi_streammidi_stream)
+Performance::output (Midi_stream &midi_stream)
 {
 {
-  int tracks_i = audio_staff_l_arr_.size () + 1;
+  int tracks_i = audio_staffs_.size () + 1;
 
   // ugh
   int clocks_per_4_i = 384;
 
   midi_stream << Midi_header (1, tracks_i, clocks_per_4_i);
   output_header_track (midi_stream);
 
   // ugh
   int clocks_per_4_i = 384;
 
   midi_stream << Midi_header (1, tracks_i, clocks_per_4_i);
   output_header_track (midi_stream);
-  progress_indication ("\n");
-  progress_indication (_ ("Track ... "));
+  message (_ ("Track...") + " ");
   int channel = 0;
   int channel = 0;
-  for (int i =0; i < audio_staff_l_arr_.size (); i++)
+  for (vsize i = 0; i < audio_staffs_.size (); i++)
     {
     {
-      Audio_staff *s = audio_staff_l_arr_[i];
-      if (verbose_global_b)
-       progress_indication ("[" + to_str (i)) ;
+      Audio_staff *s = audio_staffs_[i];
+      if (be_verbose_global)
+       progress_indication ("[" + to_string (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.
        MIDI players tend to ignore instrument settings on
        channel 10, the percussion channel by default.
-       */
-      if (channel == 9)
-        channel++;
-      if (s->channel_i_ < 0)
-        s->channel_i_ = channel;
+      */
+      if (channel % 16 == 9)
+       channel++;
+
+      /*
+       Huh? Why does each staff also have a separate channel? We
+       should map channels to voices, not staves. --hwn.
+      */
+      if (s->channel_ < 0)
+       {
+         s->channel_ = channel % 16;
+         if (channel > 15)
+           {
+             warning (_ ("MIDI channel wrapped around"));
+             warning (_ ("remapping modulo 16"));
+           }
+       }
+
       s->output (midi_stream, channel++);
       s->output (midi_stream, channel++);
-      if (verbose_global_b)
+      if (be_verbose_global)
        progress_indication ("]");
     }
 }
 
 void
        progress_indication ("]");
     }
 }
 
 void
-Performance::output_header_track (Midi_streammidi_stream)
+Performance::output_header_track (Midi_stream &midi_stream)
 {
   Midi_track midi_track;
 
 {
   Midi_track midi_track;
 
-  midi_track.channel_i_ = 9;
+  midi_track.channel_ = 9;
 
   // perhaps multiple text events?
 
   // perhaps multiple text events?
-  String id_str;
-  String str = String (_ ("Creator: "));
-  id_str = String_convert::pad_to (gnu_lilypond_version_str (), 40);
-  str += id_str;
-  str += "\n";
+  std::string id_string;
+  std::string str = std::string (_ ("Creator: "));
+  id_string = String_convert::pad_to (gnu_lilypond_version_string (), 30);
+  str += id_string;
 
   /*
     This seems silly, but in fact the audio elements should
     be generated elsewhere: not midi-specific.
 
   /*
     This seems silly, but in fact the audio elements should
     be generated elsewhere: not midi-specific.
-   */
+  */
   Audio_text creator_a (Audio_text::TEXT, str);
   Midi_text creator (&creator_a);
   midi_track.add (Moment (0), &creator);
 
   /* Better not translate this */
   str = "Generated automatically by: ";
   Audio_text creator_a (Audio_text::TEXT, str);
   Midi_text creator (&creator_a);
   midi_track.add (Moment (0), &creator);
 
   /* Better not translate this */
   str = "Generated automatically by: ";
-  str += id_str;
-  str += _ (", at ");
-  time_t t (time (0));
-  str += ctime (&t);
-  str = str.left_str (str.length_i () - 1);
+  str += id_string;
 
 
-  /*
-    Pad out time stamps to 120 chars.  */
-  
-  str = String_convert::pad_to (str, 120);
-  
   Audio_text generate_a (Audio_text::TEXT, str);
   Midi_text generate (&generate_a);
   midi_track.add (Moment (0), &generate);
 
   Audio_text generate_a (Audio_text::TEXT, str);
   Midi_text generate (&generate_a);
   midi_track.add (Moment (0), &generate);
 
-  str = _f ("from musical definition: %s", origin_str_);
+  str = _ ("at ");
+  time_t t (time (0));
+  str += ctime (&t);
+  str = str.substr (0, str.length () - 1);
+  str = String_convert::pad_to (str, 60);
+
+  Audio_text at_a (Audio_text::TEXT, str);
+  Midi_text at (&at_a);
+  midi_track.add (Moment (0), &at);
+
+  // TODO:
+  //  str = _f ("from musical definition: %s", origin_string_);
 
   Audio_text from_a (Audio_text::TEXT, str);
   Midi_text from (&from_a);
   midi_track.add (Moment (0), &from);
 
   Audio_text track_name_a (Audio_text::TRACK_NAME, "Track "
 
   Audio_text from_a (Audio_text::TEXT, str);
   Midi_text from (&from_a);
   midi_track.add (Moment (0), &from);
 
   Audio_text track_name_a (Audio_text::TRACK_NAME, "Track "
-                          + String_convert::i2dec_str (0, 0, '0'));
+                          + String_convert::int2dec (0, 0, '0'));
   Midi_text track_name (&track_name_a);
   Midi_text track_name (&track_name_a);
-                       
+
   midi_track.add (Moment (0), &track_name);
 
   // Some sequencers read track 0 last.
   midi_track.add (Moment (0), &track_name);
 
   // Some sequencers read track 0 last.
-  //  Audio_tempo tempo_a (midi_l_->get_tempo_i (Moment (1, 4)));
+  //  Audio_tempo tempo_a (midi_->get_tempo (Moment (Rational (1, 4))));
   //  Midi_tempo tempo (&tempo_a);
   //  midi_track.add (Moment (0), &tempo);
 
   //  Midi_tempo tempo (&tempo_a);
   //  midi_track.add (Moment (0), &tempo);
 
@@ -133,41 +144,26 @@ Performance::output_header_track (Midi_stream& midi_stream)
 void
 Performance::add_element (Audio_element *p)
 {
 void
 Performance::add_element (Audio_element *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_);
+  if (Audio_staff *s = dynamic_cast<Audio_staff *> (p))
+    audio_staffs_.push_back (s);
+  audio_element_list_ = new Killing_cons<Audio_element> (p, audio_element_list_);
 }
 
 }
 
-
 void
 void
-Performance::process ()
+Performance::write_output (std::string out)
 {
 {
-  String out = output_name_global;
   if (out == "-")
     out = "lelie.midi";
   if (out == "-")
     out = "lelie.midi";
-  int def = midi_l_->get_next_score_count ();
-  if (def)
-    {
-      Path p = split_path (out);
-      p.base += "-" + to_str (def);
-      out = p.str ();
-    }
 
   /* Maybe a bit crude, but we had this before */
 
   /* Maybe a bit crude, but we had this before */
-  Path p = split_path (out);
-  p.ext = "midi";
-  out = p.str ();
-  
+  File_name file_name (out);
+  file_name.ext_ = "midi";
+  out = file_name.to_string ();
+
   Midi_stream midi_stream (out);
   Midi_stream midi_stream (out);
-  progress_indication (_f ("MIDI output to %s...", out));
-  target_str_global_array.push (out);
+  message (_f ("MIDI output to `%s'...", out));
 
   output (midi_stream);
   progress_indication ("\n");
 }
 
   output (midi_stream);
   progress_indication ("\n");
 }
+