]> git.donarmstrong.com Git - lilypond.git/blob - lily/include/midi-item.hh
6ec530f68cfd0d1a4dd85ce495618a2f13ade476
[lilypond.git] / lily / include / midi-item.hh
1 /*
2   midi-item.hh -- declare Midi items
3
4   (c) 1997--2006 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   /// factory
27   static Midi_item *get_midi (Audio_item *a);
28
29   static string i2varint_string (int i);
30
31   virtual string to_string () const = 0;
32 };
33
34 class Midi_channel_item : public Midi_item
35 {
36 public:
37   int channel_;
38   DECLARE_CLASSNAME(Midi_channel_item);
39   Midi_channel_item ();
40   virtual const char *name () const { return "Midi_channel_item"; }
41   virtual ~Midi_channel_item ();
42 };
43
44 /**
45    timed MIDI event
46 */
47 class Midi_event
48 {
49 public:
50   Midi_event (Moment delta_mom, Midi_item *midi);
51
52   Moment delta_mom_;
53   Midi_item *midi_;
54   string to_string () const;
55 };
56
57 /**
58    variable sized MIDI data
59 */
60 class Midi_chunk : public Midi_item
61 {
62 public:
63   void set (string header_string, string data_string, string footer_string);
64   virtual string to_string () const;
65   virtual string data_string () const;
66   DECLARE_CLASSNAME(Midi_chunk);
67
68 private:
69   string data_string_;
70   string footer_string_;
71   string header_string_;
72 };
73
74 class Midi_duration : public Midi_item
75 {
76 public:
77   Midi_duration (Real seconds_f);
78
79   virtual string to_string () const;
80   Real seconds_;
81 };
82
83 class Midi_header : public Midi_chunk
84 {
85 public:
86     DECLARE_CLASSNAME(Midi_header);
87
88   Midi_header (int format_i, int tracks_i, int clocks_per_4_i);
89 };
90
91 /**
92    Change instrument event
93 */
94 class Midi_instrument : public Midi_channel_item
95 {
96 public:
97   Midi_instrument (Audio_instrument *);
98
99   DECLARE_CLASSNAME(Midi_instrument);
100   virtual string to_string () const;
101
102   Audio_instrument *audio_;
103 };
104
105 class Midi_key : public Midi_item
106 {
107 public:
108   Midi_key (Audio_key *);
109   DECLARE_CLASSNAME(Midi_key);
110
111   virtual string to_string () const;
112
113   Audio_key *audio_;
114 };
115
116 class Midi_time_signature : public Midi_item
117 {
118 public:
119   Midi_time_signature (Audio_time_signature *);
120   DECLARE_CLASSNAME(Midi_time_signature);
121
122   virtual string to_string () const;
123
124   Audio_time_signature *audio_;
125   int clocks_per_1_;
126 };
127
128 /**
129    Turn a note on.
130 */
131 class Midi_note : public Midi_channel_item
132 {
133 public:
134   Midi_note (Audio_note *);
135   DECLARE_CLASSNAME(Midi_note);
136
137   Moment get_length () const;
138   int get_pitch () const;
139   int get_fine_tuning () const;
140   virtual string to_string () const;
141
142   Audio_note *audio_;
143
144   
145   static int const c0_pitch_ = 60;
146   Byte dynamic_byte_;
147 };
148
149 /**
150    Turn a note off
151 */
152 class Midi_note_off : public Midi_note
153 {
154 public:
155   Midi_note_off (Midi_note *);
156   DECLARE_CLASSNAME(Midi_note_off);
157
158   virtual string to_string () const;
159
160   Midi_note *on_;
161   Byte aftertouch_byte_;
162 };
163
164 class Midi_text : public Midi_item
165 {
166 public:
167   enum Type
168     {
169       TEXT = 1, COPYRIGHT, TRACK_NAME, INSTRUMENT_NAME, LYRIC,
170       MARKER, CUE_POINT
171     };
172   DECLARE_CLASSNAME(Midi_text);
173
174   Midi_text (Audio_text *);
175
176   virtual string to_string () const;
177
178   Audio_text *audio_;
179 };
180
181 class Midi_dynamic : public Midi_channel_item
182 {
183 public:
184   Midi_dynamic (Audio_dynamic *);
185   DECLARE_CLASSNAME(Midi_dynamic);
186
187   virtual string to_string () const;
188
189   Audio_dynamic *audio_;
190 };
191
192 class Midi_piano_pedal : public Midi_channel_item
193 {
194 public:
195   Midi_piano_pedal (Audio_piano_pedal *);
196   DECLARE_CLASSNAME(Midi_piano_pedal);
197
198   virtual string to_string () const;
199
200   Audio_piano_pedal *audio_;
201 };
202
203 class Midi_tempo : public Midi_item
204 {
205 public:
206   Midi_tempo (Audio_tempo *);
207   DECLARE_CLASSNAME(Midi_tempo);
208
209   virtual string to_string () const;
210
211   Audio_tempo *audio_;
212 };
213
214 class Midi_track : public Midi_chunk
215 {
216 public:
217   int number_;
218   DECLARE_CLASSNAME(Midi_track);
219
220   /*
221     Compensate for starting grace notes.
222   */
223   vector<Midi_event*> events_;
224
225   Midi_track ();
226   ~Midi_track ();
227
228   void add (Moment delta_time_mom, Midi_item *midi);
229   virtual string data_string () const;
230 };
231
232 #endif // MIDI_ITEM_HH