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