]> git.donarmstrong.com Git - lilypond.git/blob - lily/include/midi-item.hh
release: 0.1.41
[lilypond.git] / lily / include / midi-item.hh
1 /*
2   midi-item.hh -- declare Midi items
3
4   (c) 1997 Jan Nieuwenhuizen <jan@digicash.com>
5  */
6
7 #ifndef MIDI_ITEM_HH
8 #define MIDI_ITEM_HH
9
10 #include "string.hh"
11 #include "lily-proto.hh"
12 #include "virtual-methods.hh"
13 #include "moment.hh"
14
15 /**
16   Any piece of midi information.
17
18   Maybe use base classes for RIFF files?
19  */
20 struct Midi_item {
21     DECLARE_MY_RUNTIME_TYPEINFO;
22     Midi_item (Audio_item* audio_item_l); 
23     virtual ~Midi_item ();
24     static String i2varint_str (int i);
25     void output (Midi_stream* midi_stream_l) const;
26     virtual String str() const = 0;
27
28     Audio_item* audio_item_l_;
29     int channel_i_;
30
31 private:
32     Midi_item (Midi_item const&);
33     Midi_item& operator =( Midi_item const&);
34 };
35
36 /**
37   variable sized MIDI data
38  */
39 struct Midi_chunk : Midi_item {
40     DECLARE_MY_RUNTIME_TYPEINFO;
41     Midi_chunk();
42
43     void add (String str);
44     void set (String header_str, String data_str, String footer_str);
45     virtual String str() const;
46
47 private:
48     String data_str_;
49     String footer_str_;
50     String header_str_;
51 };
52
53 struct Midi_duration : public Midi_item {
54     DECLARE_MY_RUNTIME_TYPEINFO;
55     Midi_duration (Real seconds_f);
56
57     virtual String str() const;
58     Real seconds_f_;
59 };
60
61 struct Midi_header : Midi_chunk {
62     DECLARE_MY_RUNTIME_TYPEINFO;
63
64     Midi_header (int format_i, int tracks_i, int clocks_per_4_i);
65
66 };
67
68 /**
69   Change instrument event
70  */
71 struct Midi_instrument : public Midi_item {
72     DECLARE_MY_RUNTIME_TYPEINFO;
73     Midi_instrument (int channel_i, String instrument_str);
74
75     virtual String str() const;
76     String instrument_str_;
77 };
78                                       
79
80 struct Midi_key : public Midi_item {
81     DECLARE_MY_RUNTIME_TYPEINFO;
82     Midi_key (Audio_item* audio_item_l);
83         
84     virtual String str() const;
85 };
86
87 struct Midi_meter : Midi_item {
88
89     DECLARE_MY_RUNTIME_TYPEINFO;
90     Midi_meter (Audio_item* audio_item_l); 
91   
92     virtual String str() const;
93     int clocks_per_1_i_;
94 };
95
96 /**
97   Turn a note on (blond).
98  */
99 struct Midi_note : public Midi_item {
100     DECLARE_MY_RUNTIME_TYPEINFO;
101     Midi_note (Audio_item* audio_item_l); 
102
103     Moment duration() const;
104     int pitch_i() const;
105     virtual String str() const;
106
107     int const c0_pitch_i_c_ = 60;
108     Byte dynamic_byte_;
109 };
110
111 /**
112   Turn a note off (dark).
113  */
114 struct Midi_note_off : public Midi_item {
115     DECLARE_MY_RUNTIME_TYPEINFO;
116     Midi_note_off (Midi_note* midi_note_l); 
117
118     int pitch_i() const;
119     virtual String str() const;
120
121     Byte aftertouch_byte_;
122 };
123
124 struct Midi_text : Midi_item {
125     DECLARE_MY_RUNTIME_TYPEINFO;
126     
127     enum Type { 
128         TEXT = 1, COPYRIGHT, TRACK_NAME, INSTRUMENT_NAME, LYRIC, 
129         MARKER, CUE_POINT
130     };
131     Midi_text (Midi_text::Type type, String text_str);
132     Midi_text (Audio_item* audio_item_l);
133     
134     virtual String str() const;
135
136     Type type_;
137     String text_str_;
138 };
139
140 struct Midi_tempo : Midi_item {
141     DECLARE_MY_RUNTIME_TYPEINFO;
142     Midi_tempo (int per_minute_4_i);
143     Midi_tempo (Audio_item* audio_item_l); 
144   
145     virtual String str() const;
146
147     int per_minute_4_i_;
148 };
149
150 struct Midi_track : Midi_chunk {
151     DECLARE_MY_RUNTIME_TYPEINFO;
152     int number_i_;
153     
154     Midi_track();
155
156     void add (int delta_time_i, String event);
157     void add (Moment delta_time_moment, Midi_item* mitem_l);
158 };
159
160 #endif // MIDI_ITEM_HH