#include "audio-staff.hh"
-#include "midi-item.hh"
+#include "midi-chunk.hh"
#include "midi-stream.hh"
#include "midi-walker.hh"
class Midi_chunk;
class Midi_duration;
class Midi_dynamic;
+class Midi_event;
class Midi_header;
class Midi_instrument;
class Midi_item;
--- /dev/null
+/*
+ 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 */
+
#include "audio-item.hh"
#include "std-vector.hh"
+string int2midi_varint_string (int i);
+
/**
Any piece of midi information.
static Midi_item *get_midi (Audio_item *a);
- static string i2varint_string (int i);
virtual string to_string () const = 0;
};
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:
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
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
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_;
--- /dev/null
+/*
+ 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;
+}
+
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)
{
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;
}
string
-Midi_item::i2varint_string (int i)
+int2midi_varint_string (int i)
{
int buffer = i & 0x7f;
while ((i >>= 7) > 0)
{
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 ()
-{
-}
#include "international.hh"
#include "main.hh"
-#include "midi-item.hh"
+#include "midi-chunk.hh"
#include "misc.hh"
#include "program-option.hh"
#include "stream.hh"
}
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));
-}
-
#include "audio-column.hh"
#include "audio-staff.hh"
#include "midi-item.hh"
+#include "midi-chunk.hh"
#include "midi-stream.hh"
#include "warn.hh"
#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"