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