]> git.donarmstrong.com Git - lilypond.git/blob - lily/midi-chunk.cc
3e9f898993e9f076234e26acd56936e6961e1685
[lilypond.git] / lily / midi-chunk.cc
1 /* 
2   midi-chunk.cc -- implement Midi_chunk
3   
4   source file of the GNU LilyPond music typesetter
5   
6   (c) 2007 Han-Wen Nienhuys <hanwen@lilypond.org>
7   
8 */
9
10 #include "midi-chunk.hh"
11
12 #include "midi-item.hh"
13 #include "std-string.hh"
14 #include "string-convert.hh"
15
16 Midi_track::Midi_track ()
17 {
18   //                4D 54 72 6B     MTrk
19   //                00 00 00 3B     chunk length (59)
20   //        00      FF 58 04 04 02 18 08    time signature
21   //        00      FF 51 03 07 A1 20       tempo
22
23   // FF 59 02 sf mi  Key Signature
24   //         sf = -7:  7 flats
25   //         sf = -1:  1 flat
26   //         sf = 0:  key of C
27   //         sf = 1:  1 sharp
28   //         sf = 7: 7 sharps
29   //         mi = 0:  major key
30   //         mi = 1:  minor key
31
32   number_ = 0;
33
34   char const *data_str0 = ""
35     //        "00" "ff58" "0404" "0218" "08"
36     //  "00" "ff51" "0307" "a120"
37     // why a key at all, in midi?
38     // key: C
39     //  "00" "ff59" "02" "00" "00"
40     // key: F (scsii-menuetto)
41     //                            "00" "ff59" "02" "ff" "00"
42     ;
43
44   string data_string;
45   // only for format 0 (currently using format 1)?
46   data_string += String_convert::hex2bin (data_str0);
47
48   char const *footer_str0 = "00" "ff2f" "00";
49   string footer_string = String_convert::hex2bin (footer_str0);
50
51   set ("MTrk", data_string, footer_string);
52 }
53
54 void
55 Midi_track::add (int delta_ticks, Midi_item *midi)
56 {
57   assert (delta_ticks >= 0);
58
59   Midi_event *e = new Midi_event (delta_ticks, midi);
60   events_.push_back (e);
61 }
62
63 string
64 Midi_track::data_string () const
65 {
66   string str = Midi_chunk::data_string ();
67
68   for (vector<Midi_event*>::const_iterator i (events_.begin ());
69        i != events_.end (); i ++)
70     {
71       str += (*i)->to_string ();
72     }
73   return str;
74 }
75
76
77 Midi_track::~Midi_track ()
78 {
79   junk_pointers (events_); 
80 }
81
82 /****************************************************************
83   event
84 */
85 Midi_event::Midi_event (int delta_ticks, Midi_item *midi)
86 {
87   delta_ticks_ = delta_ticks;
88   midi_ = midi;
89 }
90
91 string
92 Midi_event::to_string () const
93 {
94   string delta_string = int2midi_varint_string (delta_ticks_);
95   string midi_string = midi_->to_string ();
96   assert (midi_string.length ());
97   return delta_string + midi_string;
98 }
99 /****************************************************************
100  header
101 */ 
102
103 Midi_header::Midi_header (int format, int tracks, int clocks_per_4)
104 {
105   string str;
106
107   string format_string = String_convert::int2hex (format, 4, '0');
108   str += String_convert::hex2bin (format_string);
109
110   string tracks_string = String_convert::int2hex (tracks, 4, '0');
111   str += String_convert::hex2bin (tracks_string);
112
113   string tempo_string = String_convert::int2hex (clocks_per_4, 4, '0');
114   str += String_convert::hex2bin (tempo_string);
115
116   set ("MThd", str, "");
117 }
118
119
120 /****************************************************************
121    chunk
122  */
123 Midi_chunk::~Midi_chunk ()
124 {
125   
126 }
127
128 void
129 Midi_chunk::set (string header_string, string data_string, string footer_string)
130 {
131   data_string_ = data_string;
132   footer_string_ = footer_string;
133   header_string_ = header_string;
134 }
135
136 string
137 Midi_chunk::data_string () const
138 {
139   return data_string_;
140 }
141
142 string
143 Midi_chunk::to_string () const
144 {
145   string str = header_string_;
146   string dat = data_string ();
147   string length_string = String_convert::int2hex (dat.length ()
148                                                   + footer_string_.length (), 8, '0');
149   length_string = String_convert::hex2bin (length_string);
150
151   str += length_string;
152   str += dat;
153   str += footer_string_;
154
155   return str;
156 }
157