]> git.donarmstrong.com Git - lilypond.git/blob - lily/include/midi-item.hh
release: 1.3.131
[lilypond.git] / lily / include / midi-item.hh
1 /*
2   midi-item.hh -- declare Midi items
3
4   (c)  1997--2001 Jan Nieuwenhuizen <janneke@gnu.org>
5  */
6
7 #ifndef MIDI_ITEM_HH
8 #define MIDI_ITEM_HH
9
10 #include "cons.hh"
11 #include "string.hh"
12 #include "lily-proto.hh"
13 #include "moment.hh"
14 #include "audio-item.hh"
15
16 /**
17   Any piece of midi information.
18
19   Maybe use base classes for RIFF files?
20  */
21 class Midi_item
22 {
23 public:
24   Midi_item ();
25   virtual ~Midi_item ();
26
27   /// factory
28   static Midi_item* midi_p (Audio_item* a);
29
30   static String i2varint_str (int i);
31
32   virtual String str () const = 0;
33
34   int channel_i_;
35 };
36
37 /**
38   timed MIDI event
39  */
40 class Midi_event
41 {
42 public:
43   Midi_event (Moment delta_mom, Midi_item* midi_l);
44
45   Moment delta_mom_;
46   Midi_item* midi_p_;
47   String str () const;
48 };
49
50 /**
51   variable sized MIDI data
52  */
53 class Midi_chunk : public Midi_item
54 {
55 public:
56   void set (String header_str, String data_str, String footer_str);
57   virtual String str () const;
58   virtual String data_str () const;
59
60 private:
61   String data_str_;
62   String footer_str_;
63   String header_str_;
64 };
65
66 class Midi_duration : public Midi_item
67 {
68 public:
69   Midi_duration (Real seconds_f);
70
71   virtual String str () const;
72   Real seconds_f_;
73 };
74
75 class Midi_header : public Midi_chunk
76 {
77 public:
78   Midi_header (int format_i, int tracks_i, int clocks_per_4_i);
79 };
80
81 /**
82   Change instrument event
83  */
84 class Midi_instrument : public Midi_item
85 {
86 public:
87   Midi_instrument (Audio_instrument*);
88
89   virtual String str () const;
90
91   Audio_instrument* audio_l_;
92 };
93                                       
94
95 class Midi_key : public Midi_item
96 {
97 public:
98   Midi_key (Audio_key*);
99         
100   virtual String str () const;
101
102   Audio_key* audio_l_;
103 };
104
105 class Midi_time_signature : public Midi_item
106 {
107 public:
108   Midi_time_signature (Audio_time_signature*);
109   
110   virtual String str () const;
111
112   Audio_time_signature* audio_l_;
113   int clocks_per_1_i_;
114 };
115
116 /**
117   Turn a note on.
118  */
119 class Midi_note : public Midi_item
120 {
121 public:
122   Midi_note (Audio_note*);
123
124   Moment length_mom () const;
125   int pitch_i () const;
126   virtual String str () const;
127
128   Audio_note* audio_l_;
129
130   static int const c0_pitch_i_c_ = 60;
131   Byte dynamic_byte_;
132 };
133
134 /**
135   Turn a note off 
136  */
137 class Midi_note_off : public Midi_note
138 {
139 public:
140   Midi_note_off (Midi_note*); 
141
142   virtual String str () const;
143
144   Midi_note* on_l_;
145   Byte aftertouch_byte_;
146 };
147
148 class Midi_text : public Midi_item
149 {
150 public:
151   enum Type { 
152     TEXT = 1, COPYRIGHT, TRACK_NAME, INSTRUMENT_NAME, LYRIC, 
153     MARKER, CUE_POINT
154   };
155
156   Midi_text (Audio_text*);
157     
158   virtual String str () const;
159
160   Audio_text* audio_l_;
161 };
162
163 class Midi_dynamic : public Midi_item
164 {
165 public:
166   Midi_dynamic (Audio_dynamic*);
167   
168   virtual String str () const;
169
170   Audio_dynamic* audio_l_;
171 };
172
173 class Midi_piano_pedal : public Midi_item
174 {
175 public:
176   Midi_piano_pedal (Audio_piano_pedal*);
177   
178   virtual String str () const;
179
180   Audio_piano_pedal* audio_l_;
181 };
182
183 class Midi_tempo : public Midi_item
184 {
185 public:
186   Midi_tempo (Audio_tempo*);
187   
188   virtual String str () const;
189
190   Audio_tempo* audio_l_;
191 };
192
193 class Midi_track : public Midi_chunk
194 {
195 public:
196   int number_i_;
197   Cons_list<Midi_event> event_p_list_;
198   
199   Midi_track ();
200
201   void add (Moment delta_time_mom, Midi_item* midi_l);
202   virtual String data_str () const;
203 };
204
205 #endif // MIDI_ITEM_HH