Fixes Issue 1504, allowing feather beam line breaking.
[lilypond/patrick.git] / lily / midi-chunk.cc
blob9c2a4bdf100caa46ed90e19b5a4f8dc8b007131a
1 /*
2 This file is part of LilyPond, the GNU music typesetter.
4 Copyright (C) 2007--2011 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 (int number, bool port)
28 : number_ (number)
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
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
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"
54 string data_string;
55 // only for format 0 (currently using format 1)?
56 data_string += String_convert::hex2bin (data_str0);
58 if (port)
60 string port = "00" "ff" "21" "01"
61 + String_convert::int2hex (number_, 2, '0');
62 data_string += String_convert::hex2bin (port);
65 char const *footer_str0 = "00" "ff2f" "00";
66 string footer_string = String_convert::hex2bin (footer_str0);
68 set ("MTrk", data_string, footer_string);
71 void
72 Midi_track::add (int delta_ticks, Midi_item *midi)
74 assert (delta_ticks >= 0);
76 Midi_event *e = new Midi_event (delta_ticks, midi);
77 events_.push_back (e);
80 string
81 Midi_track::data_string () const
83 string str = Midi_chunk::data_string ();
85 for (vector<Midi_event*>::const_iterator i (events_.begin ());
86 i != events_.end (); i ++)
88 str += (*i)->to_string ();
90 return str;
94 Midi_track::~Midi_track ()
96 junk_pointers (events_);
99 /****************************************************************
100 event
102 Midi_event::Midi_event (int delta_ticks, Midi_item *midi)
104 delta_ticks_ = delta_ticks;
105 midi_ = midi;
108 string
109 Midi_event::to_string () const
111 string delta_string = int2midi_varint_string (delta_ticks_);
112 string midi_string = midi_->to_string ();
113 assert (midi_string.length ());
114 return delta_string + midi_string;
116 /****************************************************************
117 header
120 Midi_header::Midi_header (int format, int tracks, int clocks_per_4)
122 string str;
124 string format_string = String_convert::int2hex (format, 4, '0');
125 str += String_convert::hex2bin (format_string);
127 string tracks_string = String_convert::int2hex (tracks, 4, '0');
128 str += String_convert::hex2bin (tracks_string);
130 string tempo_string = String_convert::int2hex (clocks_per_4, 4, '0');
131 str += String_convert::hex2bin (tempo_string);
133 set ("MThd", str, "");
137 /****************************************************************
138 chunk
140 Midi_chunk::~Midi_chunk ()
145 void
146 Midi_chunk::set (string header_string, string data_string, string footer_string)
148 data_string_ = data_string;
149 footer_string_ = footer_string;
150 header_string_ = header_string;
153 string
154 Midi_chunk::data_string () const
156 return data_string_;
159 string
160 Midi_chunk::to_string () const
162 string str = header_string_;
163 string dat = data_string ();
164 string length_string = String_convert::int2hex (dat.length ()
165 + footer_string_.length (), 8, '0');
166 length_string = String_convert::hex2bin (length_string);
168 str += length_string;
169 str += dat;
170 str += footer_string_;
172 return str;