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