]> git.donarmstrong.com Git - lilypond.git/blob - lily/include/midi-item.hh
Plug MIDI memory leak, and correct end-of-track issues.
[lilypond.git] / lily / include / midi-item.hh
1 /*
2   midi-item.hh -- declare Midi items
3
4   (c) 1997--2007 Jan Nieuwenhuizen <janneke@gnu.org>
5 */
6
7 #ifndef MIDI_ITEM_HH
8 #define MIDI_ITEM_HH
9
10 #include "audio-item.hh"
11 #include "std-vector.hh"
12
13 /**
14    Any piece of midi information.
15
16    Maybe use base classes for RIFF files?
17 */
18 class Midi_item
19 {
20 public:
21   DECLARE_CLASSNAME(Midi_item);
22   Midi_item ();
23   virtual ~Midi_item ();
24   virtual char const *name () const;
25
26   static Midi_item *get_midi (Audio_item *a);
27
28   static string i2varint_string (int i);
29
30   virtual string to_string () const = 0;
31 };
32
33 class Midi_channel_item : public Midi_item
34 {
35 public:
36   int channel_;
37   DECLARE_CLASSNAME(Midi_channel_item);
38   Midi_channel_item ();
39 };
40
41 /**
42    timed MIDI event
43 */
44 class Midi_event
45 {
46 public:
47   Midi_event (int delta, Midi_item *midi);
48
49   int delta_ticks_;
50   Midi_item *midi_;
51   string to_string () const;
52 };
53
54 /**
55    variable sized MIDI data
56 */
57 class Midi_chunk : public Midi_item
58 {
59 public:
60   void set (string header_string, string data_string, string footer_string);
61   virtual string to_string () const;
62   virtual string data_string () const;
63   DECLARE_CLASSNAME(Midi_chunk);
64
65 private:
66   string data_string_;
67   string footer_string_;
68   string header_string_;
69 };
70
71 class Midi_duration : public Midi_item
72 {
73 public:
74   Midi_duration (Real seconds_f);
75
76   virtual string to_string () const;
77   Real seconds_;
78 };
79
80 class Midi_header : public Midi_chunk
81 {
82 public:
83     DECLARE_CLASSNAME(Midi_header);
84
85   Midi_header (int format_i, int tracks_i, int clocks_per_4_i);
86 };
87
88 /**
89    Change instrument event
90 */
91 class Midi_instrument : public Midi_channel_item
92 {
93 public:
94   Midi_instrument (Audio_instrument *);
95
96   DECLARE_CLASSNAME(Midi_instrument);
97   virtual string to_string () const;
98
99   Audio_instrument *audio_;
100 };
101
102 class Midi_key : public Midi_item
103 {
104 public:
105   Midi_key (Audio_key *);
106   DECLARE_CLASSNAME(Midi_key);
107
108   virtual string to_string () const;
109
110   Audio_key *audio_;
111 };
112
113 class Midi_time_signature : public Midi_item
114 {
115 public:
116   Midi_time_signature (Audio_time_signature *);
117   DECLARE_CLASSNAME(Midi_time_signature);
118
119   virtual string to_string () const;
120
121   Audio_time_signature *audio_;
122   int clocks_per_1_;
123 };
124
125 class Midi_note : public Midi_channel_item
126 {
127 public:
128   Midi_note (Audio_note *);
129   DECLARE_CLASSNAME(Midi_note);
130
131   int get_semitone_pitch () const;
132   int get_fine_tuning () const;
133   virtual string to_string () const;
134
135   Audio_note *audio_;
136
137   
138   static int const c0_pitch_ = 60;
139   Byte dynamic_byte_;
140 };
141
142 class Midi_note_off : public Midi_note
143 {
144 public:
145   Midi_note_off (Midi_note *);
146   DECLARE_CLASSNAME(Midi_note_off);
147
148   virtual string to_string () const;
149
150   Midi_note *on_;
151   Byte aftertouch_byte_;
152 };
153
154 class Midi_text : public Midi_item
155 {
156 public:
157   enum Type
158     {
159       TEXT = 1, COPYRIGHT, TRACK_NAME, INSTRUMENT_NAME, LYRIC,
160       MARKER, CUE_POINT
161     };
162   DECLARE_CLASSNAME(Midi_text);
163
164   Midi_text (Audio_text *);
165
166   virtual string to_string () const;
167
168   Audio_text *audio_;
169 };
170
171 class Midi_dynamic : public Midi_channel_item
172 {
173 public:
174   Midi_dynamic (Audio_dynamic *);
175   DECLARE_CLASSNAME(Midi_dynamic);
176
177   virtual string to_string () const;
178
179   Audio_dynamic *audio_;
180 };
181
182 class Midi_piano_pedal : public Midi_channel_item
183 {
184 public:
185   Midi_piano_pedal (Audio_piano_pedal *);
186   DECLARE_CLASSNAME(Midi_piano_pedal);
187
188   virtual string to_string () const;
189
190   Audio_piano_pedal *audio_;
191 };
192
193 class Midi_tempo : public Midi_item
194 {
195 public:
196   Midi_tempo (Audio_tempo *);
197   DECLARE_CLASSNAME(Midi_tempo);
198
199   virtual string to_string () const;
200
201   Audio_tempo *audio_;
202 };
203
204 class Midi_track : public Midi_chunk
205 {
206 public:
207   int number_;
208   DECLARE_CLASSNAME(Midi_track);
209
210   vector<Midi_event*> events_;
211
212   Midi_track ();
213   ~Midi_track ();
214
215   void add (int, Midi_item *midi);
216   virtual string data_string () const;
217 };
218
219 #endif // MIDI_ITEM_HH