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