2 This file is part of LilyPond, the GNU music typesetter.
4 Copyright (C) 2007--2010 Han-Wen Nienhuys <hanwen@lilypond.org>
7 LilyPond is free software: you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation, either version 3 of the License, or
10 (at your option) any later version.
12 LilyPond is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
17 You should have received a copy of the GNU General Public License
18 along with LilyPond. If not, see <http://www.gnu.org/licenses/>.
21 #include "midi-chunk.hh"
23 #include "midi-item.hh"
24 #include "std-string.hh"
25 #include "string-convert.hh"
27 Midi_track::Midi_track ()
30 // 00 00 00 3B chunk length (59)
31 // 00 FF 58 04 04 02 18 08 time signature
32 // 00 FF 51 03 07 A1 20 tempo
34 // FF 59 02 sf mi Key Signature
45 char const *data_str0
= ""
46 // "00" "ff58" "0404" "0218" "08"
47 // "00" "ff51" "0307" "a120"
48 // why a key at all, in midi?
50 // "00" "ff59" "02" "00" "00"
51 // key: F (scsii-menuetto)
52 // "00" "ff59" "02" "ff" "00"
56 // only for format 0 (currently using format 1)?
57 data_string
+= String_convert::hex2bin (data_str0
);
59 char const *footer_str0
= "00" "ff2f" "00";
60 string footer_string
= String_convert::hex2bin (footer_str0
);
62 set ("MTrk", data_string
, footer_string
);
66 Midi_track::add (int delta_ticks
, Midi_item
*midi
)
68 assert (delta_ticks
>= 0);
70 Midi_event
*e
= new Midi_event (delta_ticks
, midi
);
71 events_
.push_back (e
);
75 Midi_track::data_string () const
77 string str
= Midi_chunk::data_string ();
79 for (vector
<Midi_event
*>::const_iterator
i (events_
.begin ());
80 i
!= events_
.end (); i
++)
82 str
+= (*i
)->to_string ();
88 Midi_track::~Midi_track ()
90 junk_pointers (events_
);
93 /****************************************************************
96 Midi_event::Midi_event (int delta_ticks
, Midi_item
*midi
)
98 delta_ticks_
= delta_ticks
;
103 Midi_event::to_string () const
105 string delta_string
= int2midi_varint_string (delta_ticks_
);
106 string midi_string
= midi_
->to_string ();
107 assert (midi_string
.length ());
108 return delta_string
+ midi_string
;
110 /****************************************************************
114 Midi_header::Midi_header (int format
, int tracks
, int clocks_per_4
)
118 string format_string
= String_convert::int2hex (format
, 4, '0');
119 str
+= String_convert::hex2bin (format_string
);
121 string tracks_string
= String_convert::int2hex (tracks
, 4, '0');
122 str
+= String_convert::hex2bin (tracks_string
);
124 string tempo_string
= String_convert::int2hex (clocks_per_4
, 4, '0');
125 str
+= String_convert::hex2bin (tempo_string
);
127 set ("MThd", str
, "");
131 /****************************************************************
134 Midi_chunk::~Midi_chunk ()
140 Midi_chunk::set (string header_string
, string data_string
, string footer_string
)
142 data_string_
= data_string
;
143 footer_string_
= footer_string
;
144 header_string_
= header_string
;
148 Midi_chunk::data_string () const
154 Midi_chunk::to_string () const
156 string str
= header_string_
;
157 string dat
= data_string ();
158 string length_string
= String_convert::int2hex (dat
.length ()
159 + footer_string_
.length (), 8, '0');
160 length_string
= String_convert::hex2bin (length_string
);
162 str
+= length_string
;
164 str
+= footer_string_
;