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