]> git.donarmstrong.com Git - lilypond.git/blob - lily/include/midi-item.hh
b979bca4ba60ee2ab3f2e88f99315720b0cc9764
[lilypond.git] / lily / include / midi-item.hh
1 /*
2   This file is part of LilyPond, the GNU music typesetter.
3
4   Copyright (C) 1997--2015 Jan Nieuwenhuizen <janneke@gnu.org>
5
6   LilyPond is free software: you can redistribute it and/or modify
7   it under the terms of the GNU General Public License as published by
8   the Free Software Foundation, either version 3 of the License, or
9   (at your option) any later version.
10
11   LilyPond is distributed in the hope that it will be useful,
12   but WITHOUT ANY WARRANTY; without even the implied warranty of
13   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14   GNU General Public License for more details.
15
16   You should have received a copy of the GNU General Public License
17   along with LilyPond.  If not, see <http://www.gnu.org/licenses/>.
18 */
19
20 #ifndef MIDI_ITEM_HH
21 #define MIDI_ITEM_HH
22
23 #include "audio-item.hh"
24 #include "std-vector.hh"
25
26 string int2midi_varint_string (int i);
27
28 /**
29    Any piece of midi information.
30
31    Maybe use base classes for RIFF files?
32 */
33 class Midi_item
34 {
35 public:
36   DECLARE_CLASSNAME (Midi_item);
37   Midi_item ();
38   virtual ~Midi_item ();
39   virtual char const *name () const;
40
41   static Midi_item *get_midi (Audio_item *a);
42
43   virtual string to_string () const = 0;
44 };
45
46 class Midi_channel_item : public Midi_item
47 {
48 public:
49   virtual ~Midi_channel_item ();
50   int channel_;
51   DECLARE_CLASSNAME (Midi_channel_item);
52   Midi_channel_item (Audio_item *ai);
53 };
54
55 /**
56    Midi control function value changes.
57 */
58 class Midi_control_function_value_change : public Midi_channel_item
59 {
60 public:
61   DECLARE_CLASSNAME (Midi_control_function_value_change);
62   Midi_control_function_value_change (Audio_control_function_value_change *ai);
63   virtual ~Midi_control_function_value_change ();
64   virtual string to_string () const;
65   Audio_control_function_value_change::Control control_;
66   Real value_;
67 };
68
69 class Midi_duration : public Midi_item
70 {
71 public:
72   Midi_duration (Real seconds_f);
73
74   virtual string to_string () const;
75   Real seconds_;
76 };
77
78 /**
79    MIDI control change
80 */
81 class Midi_control_change : public Midi_channel_item
82 {
83 public:
84   DECLARE_CLASSNAME (Midi_control_change);
85   Midi_control_change (Audio_control_change *ai);
86   virtual ~Midi_control_change ();
87   virtual string to_string () const;
88
89   Audio_control_change *audio_;
90 };
91
92 /**
93    Change instrument event
94 */
95 class Midi_instrument : public Midi_channel_item
96 {
97 public:
98   Midi_instrument (Audio_instrument *);
99
100   DECLARE_CLASSNAME (Midi_instrument);
101   virtual string to_string () const;
102
103   Audio_instrument *audio_;
104 };
105
106 class Midi_key : public Midi_item
107 {
108 public:
109   Midi_key (Audio_key *);
110   DECLARE_CLASSNAME (Midi_key);
111
112   virtual string to_string () const;
113
114   Audio_key *audio_;
115 };
116
117 class Midi_time_signature : public Midi_item
118 {
119 public:
120   Midi_time_signature (Audio_time_signature *);
121   DECLARE_CLASSNAME (Midi_time_signature);
122
123   virtual string to_string () const;
124
125   Audio_time_signature *audio_;
126   int clocks_per_1_;
127 };
128
129 class Midi_note : public Midi_channel_item
130 {
131 public:
132   Midi_note (Audio_note *);
133   DECLARE_CLASSNAME (Midi_note);
134
135   int get_semitone_pitch () const;
136   int get_fine_tuning () const;
137   virtual string to_string () const;
138
139   Audio_note *audio_;
140
141   static int const c0_pitch_ = 60;
142   Byte dynamic_byte_;
143 };
144
145 class Midi_note_off : public Midi_note
146 {
147 public:
148   Midi_note_off (Midi_note *);
149   DECLARE_CLASSNAME (Midi_note_off);
150
151   virtual string to_string () const;
152
153   Midi_note *on_;
154   Byte aftertouch_byte_;
155 };
156
157 class Midi_text : public Midi_item
158 {
159 public:
160   enum Type
161   {
162     TEXT = 1, COPYRIGHT, TRACK_NAME, INSTRUMENT_NAME, LYRIC,
163     MARKER, CUE_POINT
164   };
165   DECLARE_CLASSNAME (Midi_text);
166
167   Midi_text (Audio_text *);
168
169   virtual string to_string () const;
170
171   Audio_text *audio_;
172 };
173
174 class Midi_piano_pedal : public Midi_channel_item
175 {
176 public:
177   Midi_piano_pedal (Audio_piano_pedal *);
178   DECLARE_CLASSNAME (Midi_piano_pedal);
179
180   virtual string to_string () const;
181
182   Audio_piano_pedal *audio_;
183 };
184
185 class Midi_tempo : public Midi_item
186 {
187 public:
188   Midi_tempo (Audio_tempo *);
189   DECLARE_CLASSNAME (Midi_tempo);
190
191   virtual string to_string () const;
192
193   Audio_tempo *audio_;
194 };
195
196 #endif // MIDI_ITEM_HH