]> git.donarmstrong.com Git - lilypond.git/commitdiff
separate fixed and variable size midi data.
authorHan-Wen Nienhuys <hanwen@xs4all.nl>
Thu, 18 Jan 2007 14:27:11 +0000 (15:27 +0100)
committerHan-Wen Nienhuys <hanwen@xs4all.nl>
Thu, 18 Jan 2007 14:27:11 +0000 (15:27 +0100)
lily/audio-staff.cc
lily/include/lily-proto.hh
lily/include/midi-chunk.hh [new file with mode: 0644]
lily/include/midi-item.hh
lily/include/midi-stream.hh
lily/midi-chunk.cc [new file with mode: 0644]
lily/midi-item.cc
lily/midi-stream.cc
lily/midi-walker.cc
lily/performance.cc

index bd7edf554409420818b3f83727799b0258995584..353a26f270e272a2afc8c57389687b2686db941b 100644 (file)
@@ -8,7 +8,7 @@
 
 #include "audio-staff.hh"
 
-#include "midi-item.hh"
+#include "midi-chunk.hh"
 #include "midi-stream.hh"
 #include "midi-walker.hh"
 
index 56c80f56654ec7fb67b4dbf25d278b8308084d39..fca8aa372f9a553e1c8541ad83d0fce18caadf65 100644 (file)
@@ -90,6 +90,7 @@ class Mensural_ligature_engraver;
 class Midi_chunk;
 class Midi_duration;
 class Midi_dynamic;
+class Midi_event;
 class Midi_header;
 class Midi_instrument;
 class Midi_item;
diff --git a/lily/include/midi-chunk.hh b/lily/include/midi-chunk.hh
new file mode 100644 (file)
index 0000000..fc41a54
--- /dev/null
@@ -0,0 +1,75 @@
+/* 
+  midi-chunk.hh -- declare  Midi_chunk
+  
+  source file of the GNU LilyPond music typesetter
+  
+  (c) 2007 Han-Wen Nienhuys <hanwen@lilypond.org>
+  
+*/
+
+#ifndef MIDI_CHUNK_HH
+#define MIDI_CHUNK_HH
+
+#include "lily-proto.hh"
+#include "virtual-methods.hh"
+#include "std-vector.hh"
+
+
+/**
+   timed MIDI event
+*/
+class Midi_event
+{
+public:
+  Midi_event (int delta, Midi_item *midi);
+
+  int delta_ticks_;
+  Midi_item *midi_;
+  string to_string () const;
+};
+
+
+
+
+/**
+   variable sized MIDI data
+*/
+class Midi_chunk
+{
+public:
+  void set (string header_string, string data_string, string footer_string);
+  virtual string to_string () const;
+  virtual string data_string () const;
+  DECLARE_CLASSNAME(Midi_chunk);
+  virtual ~Midi_chunk ();
+private:
+  string data_string_;
+  string footer_string_;
+  string header_string_;
+};
+
+class Midi_header : public Midi_chunk
+{
+public:
+  DECLARE_CLASSNAME(Midi_header);
+
+  Midi_header (int format_i, int tracks_i, int clocks_per_4_i);
+};
+
+class Midi_track : public Midi_chunk
+{
+public:
+  int number_;
+  DECLARE_CLASSNAME(Midi_track);
+
+  vector<Midi_event*> events_;
+
+  Midi_track ();
+  ~Midi_track ();
+
+  void add (int, Midi_item *midi);
+  virtual string data_string () const;
+};
+
+#endif /* MIDI_CHUNK_HH */
+
index a03532694f5d52dad1349c42952996445bc1b75a..a3cea87e619c7f2c591e7e73ed8d25428cfbe930 100644 (file)
@@ -10,6 +10,8 @@
 #include "audio-item.hh"
 #include "std-vector.hh"
 
+string int2midi_varint_string (int i);
+  
 /**
    Any piece of midi information.
 
@@ -25,7 +27,6 @@ public:
 
   static Midi_item *get_midi (Audio_item *a);
 
-  static string i2varint_string (int i);
 
   virtual string to_string () const = 0;
 };
@@ -38,36 +39,6 @@ public:
   Midi_channel_item ();
 };
 
-/**
-   timed MIDI event
-*/
-class Midi_event
-{
-public:
-  Midi_event (int delta, Midi_item *midi);
-
-  int delta_ticks_;
-  Midi_item *midi_;
-  string to_string () const;
-};
-
-/**
-   variable sized MIDI data
-*/
-class Midi_chunk : public Midi_item
-{
-public:
-  void set (string header_string, string data_string, string footer_string);
-  virtual string to_string () const;
-  virtual string data_string () const;
-  DECLARE_CLASSNAME(Midi_chunk);
-
-private:
-  string data_string_;
-  string footer_string_;
-  string header_string_;
-};
-
 class Midi_duration : public Midi_item
 {
 public:
@@ -77,13 +48,6 @@ public:
   Real seconds_;
 };
 
-class Midi_header : public Midi_chunk
-{
-public:
-    DECLARE_CLASSNAME(Midi_header);
-
-  Midi_header (int format_i, int tracks_i, int clocks_per_4_i);
-};
 
 /**
    Change instrument event
@@ -201,19 +165,6 @@ public:
   Audio_tempo *audio_;
 };
 
-class Midi_track : public Midi_chunk
-{
-public:
-  int number_;
-  DECLARE_CLASSNAME(Midi_track);
-
-  vector<Midi_event*> events_;
-
-  Midi_track ();
-  ~Midi_track ();
 
-  void add (int, Midi_item *midi);
-  virtual string data_string () const;
-};
 
 #endif // MIDI_ITEM_HH
index 1d9066e8654b5de80e9ee713689fbf21924ace52..fe31d6590fb03a461ce5160616726169996cb745 100644 (file)
 using namespace std;
 
 #include "std-string.hh"
+#include "lily-proto.hh"
 
-class Midi_item;
-
-/// Midi outputfile
 struct Midi_stream
 {
   Midi_stream (string file_name_string);
   ~Midi_stream ();
 
   void write (string);
-  void write (Midi_item const &);
-  void write (int);
-
+  void write (Midi_chunk const &);
   void open ();
 
   FILE *out_file_;
diff --git a/lily/midi-chunk.cc b/lily/midi-chunk.cc
new file mode 100644 (file)
index 0000000..5aaf5bd
--- /dev/null
@@ -0,0 +1,157 @@
+/* 
+  midi-chunk.cc -- implement Midi_chunk
+  
+  source file of the GNU LilyPond music typesetter
+  
+  (c) 2007 Han-Wen Nienhuys <hanwen@lilypond.org>
+  
+*/
+
+#include "midi-chunk.hh"
+
+#include "midi-item.hh"
+#include "std-string.hh"
+#include "string-convert.hh"
+
+Midi_track::Midi_track ()
+{
+  //                4D 54 72 6B     MTrk
+  //                00 00 00 3B     chunk length (59)
+  //        00      FF 58 04 04 02 18 08    time signature
+  //        00      FF 51 03 07 A1 20       tempo
+
+  // FF 59 02 sf mi  Key Signature
+  //         sf = -7:  7 flats
+  //         sf = -1:  1 flat
+  //         sf = 0:  key of C
+  //         sf = 1:  1 sharp
+  //         sf = 7: 7 sharps
+  //         mi = 0:  major key
+  //         mi = 1:  minor key
+
+  number_ = 0;
+
+  char const *data_str0 = ""
+    //        "00" "ff58" "0404" "0218" "08"
+    // "00" "ff51" "0307" "a120"
+    // why a key at all, in midi?
+    // key: C
+    // "00" "ff59" "02" "00" "00"
+    // key: F (scsii-menuetto)
+    //                           "00" "ff59" "02" "ff" "00"
+    ;
+
+  string data_string;
+  // only for format 0 (currently using format 1)?
+  data_string += String_convert::hex2bin (data_str0);
+
+  char const *footer_str0 = "00" "ff2f" "00";
+  string footer_string = String_convert::hex2bin (footer_str0);
+
+  set ("MTrk", data_string, footer_string);
+}
+
+void
+Midi_track::add (int delta_ticks, Midi_item *midi)
+{
+  assert (delta_ticks >= 0);
+
+  Midi_event *e = new Midi_event (delta_ticks, midi);
+  events_.push_back (e);
+}
+
+string
+Midi_track::data_string () const
+{
+  string str = Midi_chunk::data_string ();
+
+  for (vector<Midi_event*>::const_iterator i (events_.begin());
+       i != events_.end(); i ++)
+    {
+      str += (*i)->to_string ();
+    }
+  return str;
+}
+
+
+Midi_track::~Midi_track ()
+{
+  junk_pointers (events_); 
+}
+
+/****************************************************************
+  event
+*/
+Midi_event::Midi_event (int delta_ticks, Midi_item *midi)
+{
+  delta_ticks_ = delta_ticks;
+  midi_ = midi;
+}
+
+string
+Midi_event::to_string () const
+{
+  string delta_string = int2midi_varint_string (delta_ticks_);
+  string midi_string = midi_->to_string ();
+  assert (midi_string.length ());
+  return delta_string + midi_string;
+}
+/****************************************************************
+ header
+*/ 
+
+Midi_header::Midi_header (int format, int tracks, int clocks_per_4)
+{
+  string str;
+
+  string format_string = String_convert::int2hex (format, 4, '0');
+  str += String_convert::hex2bin (format_string);
+
+  string tracks_string = String_convert::int2hex (tracks, 4, '0');
+  str += String_convert::hex2bin (tracks_string);
+
+  string tempo_string = String_convert::int2hex (clocks_per_4, 4, '0');
+  str += String_convert::hex2bin (tempo_string);
+
+  set ("MThd", str, "");
+}
+
+
+/****************************************************************
+   chunk
+ */
+Midi_chunk::~Midi_chunk ()
+{
+  
+}
+
+void
+Midi_chunk::set (string header_string, string data_string, string footer_string)
+{
+  data_string_ = data_string;
+  footer_string_ = footer_string;
+  header_string_ = header_string;
+}
+
+string
+Midi_chunk::data_string () const
+{
+  return data_string_;
+}
+
+string
+Midi_chunk::to_string () const
+{
+  string str = header_string_;
+  string dat = data_string ();
+  string length_string = String_convert::int2hex (dat.length ()
+                                                 + footer_string_.length (), 8, '0');
+  length_string = String_convert::hex2bin (length_string);
+
+  str += length_string;
+  str += dat;
+  str += footer_string_;
+
+  return str;
+}
+
index 4a633cc79df4ed56836b20021974158cbb805138..3d2d67a38e6b56319516a4322d78ee35842ffb4f 100644 (file)
@@ -47,35 +47,7 @@ Midi_item::get_midi (Audio_item *a)
   return 0;
 }
 
-void
-Midi_chunk::set (string header_string, string data_string, string footer_string)
-{
-  data_string_ = data_string;
-  footer_string_ = footer_string;
-  header_string_ = header_string;
-}
-
-string
-Midi_chunk::data_string () const
-{
-  return data_string_;
-}
 
-string
-Midi_chunk::to_string () const
-{
-  string str = header_string_;
-  string dat = data_string ();
-  string length_string = String_convert::int2hex (dat.length ()
-                                                 + footer_string_.length (), 8, '0');
-  length_string = String_convert::hex2bin (length_string);
-
-  str += length_string;
-  str += dat;
-  str += footer_string_;
-
-  return str;
-}
 
 Midi_duration::Midi_duration (Real seconds_f)
 {
@@ -88,37 +60,6 @@ Midi_duration::to_string () const
   return string ("<duration: ") + ::to_string (seconds_) + ">";
 }
 
-Midi_event::Midi_event (int delta_ticks, Midi_item *midi)
-{
-  delta_ticks_ = delta_ticks;
-  midi_ = midi;
-}
-
-string
-Midi_event::to_string () const
-{
-  string delta_string = Midi_item::i2varint_string (delta_ticks_);
-  string midi_string = midi_->to_string ();
-  assert (midi_string.length ());
-  return delta_string + midi_string;
-}
-
-Midi_header::Midi_header (int format, int tracks, int clocks_per_4)
-{
-  string str;
-
-  string format_string = String_convert::int2hex (format, 4, '0');
-  str += String_convert::hex2bin (format_string);
-
-  string tracks_string = String_convert::int2hex (tracks, 4, '0');
-  str += String_convert::hex2bin (tracks_string);
-
-  string tempo_string = String_convert::int2hex (clocks_per_4, 4, '0');
-  str += String_convert::hex2bin (tempo_string);
-
-  set ("MThd", str, "");
-}
-
 Midi_instrument::Midi_instrument (Audio_instrument *a)
 {
   audio_ = a;
@@ -158,7 +99,7 @@ Midi_item::~Midi_item ()
 }
 
 string
-Midi_item::i2varint_string (int i)
+int2midi_varint_string (int i)
 {
   int buffer = i & 0x7f;
   while ((i >>= 7) > 0)
@@ -391,79 +332,13 @@ Midi_text::to_string () const
 {
   string str = "ff" + String_convert::int2hex (audio_->type_, 2, '0');
   str = String_convert::hex2bin (str);
-  str += i2varint_string (audio_->text_string_.length ());
+  str += int2midi_varint_string (audio_->text_string_.length ());
   str += audio_->text_string_;
   return str;
 }
 
-Midi_track::Midi_track ()
-  : Midi_chunk ()
-{
-  //                4D 54 72 6B     MTrk
-  //                00 00 00 3B     chunk length (59)
-  //        00      FF 58 04 04 02 18 08    time signature
-  //        00      FF 51 03 07 A1 20       tempo
-
-  // FF 59 02 sf mi  Key Signature
-  //         sf = -7:  7 flats
-  //         sf = -1:  1 flat
-  //         sf = 0:  key of C
-  //         sf = 1:  1 sharp
-  //         sf = 7: 7 sharps
-  //         mi = 0:  major key
-  //         mi = 1:  minor key
-
-  number_ = 0;
-
-  char const *data_str0 = ""
-    //        "00" "ff58" "0404" "0218" "08"
-    // "00" "ff51" "0307" "a120"
-    // why a key at all, in midi?
-    // key: C
-    // "00" "ff59" "02" "00" "00"
-    // key: F (scsii-menuetto)
-    //                           "00" "ff59" "02" "ff" "00"
-    ;
-
-  string data_string;
-  // only for format 0 (currently using format 1)?
-  data_string += String_convert::hex2bin (data_str0);
-
-  char const *footer_str0 = "00" "ff2f" "00";
-  string footer_string = String_convert::hex2bin (footer_str0);
-
-  set ("MTrk", data_string, footer_string);
-}
-
-void
-Midi_track::add (int delta_ticks, Midi_item *midi)
-{
-  assert (delta_ticks >= 0);
-
-  Midi_event *e = new Midi_event (delta_ticks, midi);
-  events_.push_back (e);
-}
-
-string
-Midi_track::data_string () const
-{
-  string str = Midi_chunk::data_string ();
-
-  for (vector<Midi_event*>::const_iterator i (events_.begin());
-       i != events_.end(); i ++)
-    {
-      str += (*i)->to_string ();
-    }
-  return str;
-}
-
-
 char const *
 Midi_item::name () const
 {
    return this->class_name ();
 }
-
-Midi_track::~Midi_track ()
-{
-}
index 11afe02cf46b13e0dcc53f9a681348fdcbd558b3..bcaefe7c181fc461fde48f8a6b9b744c865321cf 100644 (file)
@@ -13,7 +13,7 @@ using namespace std;
 
 #include "international.hh"
 #include "main.hh"
-#include "midi-item.hh"
+#include "midi-chunk.hh"
 #include "misc.hh"
 #include "program-option.hh"
 #include "stream.hh"
@@ -45,16 +45,10 @@ Midi_stream::write (string str)
 }
 
 void
-Midi_stream::write (Midi_item const &midi)
+Midi_stream::write (Midi_chunk const &midi)
 {
   string str = midi.to_string ();
 
   return write (str);
 }
 
-void
-Midi_stream::write (int i)
-{
-  write (Midi_item::i2varint_string (i));
-}
-
index 08b5534e0d4badde3ebd3ceb300d409b1f438746..cef858c92768ebacf1374fb6d8f9bddb418a6536 100644 (file)
@@ -12,6 +12,7 @@
 #include "audio-column.hh"
 #include "audio-staff.hh"
 #include "midi-item.hh"
+#include "midi-chunk.hh"
 #include "midi-stream.hh"
 #include "warn.hh"
 
index 439d9489f175727bc3ad0624179acaa49b8145d2..e536622f06f550336876ea29f4e3b421df787bce 100644 (file)
@@ -17,7 +17,7 @@ using namespace std;
 #include "international.hh"
 #include "lily-version.hh"
 #include "main.hh"
-#include "midi-item.hh"
+#include "midi-chunk.hh"
 #include "midi-stream.hh"
 #include "score.hh"
 #include "string-convert.hh"