From: Han-Wen Nienhuys Date: Thu, 18 Jan 2007 14:27:11 +0000 (+0100) Subject: separate fixed and variable size midi data. X-Git-Tag: release/2.11.13-1~19 X-Git-Url: https://git.donarmstrong.com/?a=commitdiff_plain;h=5ed10e40db547f70f6f5b3ae2092ab0997d89fa3;p=lilypond.git separate fixed and variable size midi data. --- diff --git a/lily/audio-staff.cc b/lily/audio-staff.cc index bd7edf5544..353a26f270 100644 --- a/lily/audio-staff.cc +++ b/lily/audio-staff.cc @@ -8,7 +8,7 @@ #include "audio-staff.hh" -#include "midi-item.hh" +#include "midi-chunk.hh" #include "midi-stream.hh" #include "midi-walker.hh" diff --git a/lily/include/lily-proto.hh b/lily/include/lily-proto.hh index 56c80f5665..fca8aa372f 100644 --- a/lily/include/lily-proto.hh +++ b/lily/include/lily-proto.hh @@ -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 index 0000000000..fc41a541f0 --- /dev/null +++ b/lily/include/midi-chunk.hh @@ -0,0 +1,75 @@ +/* + midi-chunk.hh -- declare Midi_chunk + + source file of the GNU LilyPond music typesetter + + (c) 2007 Han-Wen Nienhuys + +*/ + +#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 events_; + + Midi_track (); + ~Midi_track (); + + void add (int, Midi_item *midi); + virtual string data_string () const; +}; + +#endif /* MIDI_CHUNK_HH */ + diff --git a/lily/include/midi-item.hh b/lily/include/midi-item.hh index a03532694f..a3cea87e61 100644 --- a/lily/include/midi-item.hh +++ b/lily/include/midi-item.hh @@ -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 events_; - - Midi_track (); - ~Midi_track (); - void add (int, Midi_item *midi); - virtual string data_string () const; -}; #endif // MIDI_ITEM_HH diff --git a/lily/include/midi-stream.hh b/lily/include/midi-stream.hh index 1d9066e865..fe31d6590f 100644 --- a/lily/include/midi-stream.hh +++ b/lily/include/midi-stream.hh @@ -11,19 +11,15 @@ 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 index 0000000000..5aaf5bd2e6 --- /dev/null +++ b/lily/midi-chunk.cc @@ -0,0 +1,157 @@ +/* + midi-chunk.cc -- implement Midi_chunk + + source file of the GNU LilyPond music typesetter + + (c) 2007 Han-Wen Nienhuys + +*/ + +#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::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; +} + diff --git a/lily/midi-item.cc b/lily/midi-item.cc index 4a633cc79d..3d2d67a38e 100644 --- a/lily/midi-item.cc +++ b/lily/midi-item.cc @@ -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 (""; } -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::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 () -{ -} diff --git a/lily/midi-stream.cc b/lily/midi-stream.cc index 11afe02cf4..bcaefe7c18 100644 --- a/lily/midi-stream.cc +++ b/lily/midi-stream.cc @@ -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)); -} - diff --git a/lily/midi-walker.cc b/lily/midi-walker.cc index 08b5534e0d..cef858c927 100644 --- a/lily/midi-walker.cc +++ b/lily/midi-walker.cc @@ -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" diff --git a/lily/performance.cc b/lily/performance.cc index 439d9489f1..e536622f06 100644 --- a/lily/performance.cc +++ b/lily/performance.cc @@ -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"