]> git.donarmstrong.com Git - lilypond.git/blob - src/midi-parser.y
release: 0.0.36
[lilypond.git] / src / midi-parser.y
1 %{
2
3 #include <iostream.h>
4
5 #include "proto.hh"         // ugh, these all for midi-main.hh 
6 #include "plist.hh"
7 #include "string.hh"
8 #include "sourcefile.hh"
9 #include "source.hh"
10 #include "midi-main.hh"    // *tors
11
12 #include "my-midi-lexer.hh"
13 #include "my-midi-parser.hh"
14 #include "moment.hh"
15 #include "midi-event.hh"
16 #include "midi-track.hh"
17 #include "midi-score.hh"
18
19 #ifndef NDEBUG
20 #define YYDEBUG 1
21 #endif
22
23 %}
24
25 %union {
26     Byte byte;
27     char c;
28     int i;
29     String* str_p;
30     Request* request_p;
31     Midi_event* midi_event_p;   // Voice_element* ?
32     Midi_score* midi_score_p;   // Input_score* ?
33     Midi_track* midi_track_p;   // Input_music* ?
34 }
35
36 %token HEADER TRACK
37 %token SYSEX_EVENT1 SYSEX_EVENT2
38 %token META_EVENT
39 %token SEQUENCE TEXT COPYRIGHT TRACK_NAME INSTRUMENT_NAME LYRIC MARKER CUE_POINT
40 %token END_OF_TRACK TEMPO SMPTE_OFFSET TIME KEY SSME
41
42 %token<i> INT8 INT16 INT32 INT7_8UNSET INT7_8SET VARINT
43 %token<i> RUNNING_STATUS DATA_ENTRY ALL_NOTES_OFF
44 %token<i> NOTE_OFF NOTE_ON 
45 %token<i> POLYPHONIC_AFTERTOUCH CONTROLMODE_CHANGE PROGRAM_CHANGE 
46 %token<i> CHANNEL_AFTERTOUCH PITCHWHEEL_RANGE
47 %token<str_p> DATA
48
49 %type <i> varint
50 %type <midi_score_p> header midi_score
51 %type <midi_track_p> track
52 %type <midi_event_p> event
53 %type <midi_event_p> the_event meta_event the_meta_event text_event midi_event sysex_event
54 %type <midi_event_p> running_status data_entry all_notes_off
55 %type <midi_event_p> note_off note_on
56 %type <midi_event_p> polyphonic_aftertouch controlmode_change program_change
57 %type <midi_event_p> channel_aftertouch pitchwheel_range
58
59 %%
60
61 midi:   /* empty */
62         | midi midi_score {
63                 midi_parser_l_g->add_score( $2 );               
64         }
65         ;
66
67 midi_score:
68         header {
69         }
70         | midi_score track {
71                 $$->add_track( $2 );
72         }
73         ;
74
75 header: 
76         HEADER INT32 INT16 INT16 INT16 {
77                 $$ = new Midi_score( $3, $4, $5 );
78                 midi_parser_l_g->set_division( $5 );
79         }
80         ;
81
82 track: 
83         TRACK INT32 {
84                 $$ = new Midi_track;
85         }
86         | track event {
87                 $$->add_event( $2 );
88         }
89         ;
90
91 event:  
92         varint the_event {
93                 if ( $2 && $2->mudela_str().length_i() ) {
94                         if ( ( $2->mudela_str()[ 0 ] >= 'a' ) 
95                                 && $2->mudela_str()[ 0 ] <= 'g' ) 
96                                 qtor << $2->mudela_str() << " ";
97                         else
98                                 vtor << $2->mudela_str() << " ";
99                 }
100         }
101         ;
102         
103 varint:
104         VARINT {
105                 midi_parser_l_g->forward( $1 );
106         }
107         ;
108
109 the_event: 
110         meta_event { 
111         }
112         | midi_event {
113         }
114         | sysex_event {
115         }
116         ;
117
118 meta_event:
119         META_EVENT the_meta_event {
120                 $$ = $2;
121         }
122         |
123         META_EVENT INT8 INT8 INT8 {
124                 $$ = 0;
125         }
126         ;
127
128 the_meta_event:
129         SEQUENCE INT16 {
130         }
131         | text_event DATA {
132                 $$ = 0;
133                 vtor << *$2 << endl;
134                 delete $2;
135         }
136         | END_OF_TRACK {
137                 $$ = 0;
138         }
139         | TEMPO INT8 INT8 INT8 { 
140                 $$ = new Midi_tempo( ( $2 << 16 ) + ( $3 << 8 ) + $4 );
141                 vtor << $$->mudela_str() << endl; // ?? waai not at event:
142                 midi_parser_l_g->set_tempo( ( $2 << 16 ) + ( $3 << 8 ) + $4 );
143         }
144         | SMPTE_OFFSET INT8 INT8 INT8 INT8 INT8 { 
145                 $$ = 0;
146         }
147         | TIME INT8 INT8 INT8 INT8 { 
148                 $$ = new Midi_time( $2, $3, $4, $5 );
149                 vtor << $$->mudela_str() << endl; // ?? waai not at event:
150                 midi_parser_l_g->set_time( $2, $3, $4, $5 );
151         }
152         | KEY INT8 INT8 { 
153                 $$ = new Midi_key( $2, $3 );
154                 midi_parser_l_g->set_key( $2, $3  );
155         }
156         | SSME DATA {
157                 $$ = 0;
158                 delete $2;
159         }
160         ;
161
162 text_event: 
163         TEXT {
164                 vtor << endl << "Text: ";
165         }
166         | COPYRIGHT {
167                 vtor << endl << "Copyright: ";
168         }
169         | TRACK_NAME {
170                 vtor << endl << "Track  name: ";
171         }
172         | INSTRUMENT_NAME {
173                 vtor << endl << "Instrument  name: ";
174         }
175         | LYRIC {
176                 vtor << endl << "Lyric: ";
177         }
178         | MARKER {
179                 vtor << endl << "Marker: ";
180         }
181         | CUE_POINT {
182                 vtor << endl << "Cue point: ";
183         }
184         ;
185
186 midi_event: 
187         running_status {
188         }
189         | data_entry {
190         }
191         | all_notes_off {
192         }
193         | note_off {
194         }
195         | note_on {
196         }
197         | polyphonic_aftertouch {
198         }
199         | controlmode_change {
200         }
201         | program_change {
202         }
203         | channel_aftertouch {
204         }
205         | pitchwheel_range {
206         }
207         ;
208
209 running_status:
210         RUNNING_STATUS INT8 { //INT8 {
211                 $$ = 0;
212         }
213         ;
214
215 data_entry:
216         DATA_ENTRY INT8 {
217                 $$ = 0;
218         }
219         ;
220
221 all_notes_off:
222         ALL_NOTES_OFF INT8 INT8 {
223                 $$ = 0;
224         }
225         ;
226
227 note_off:
228         NOTE_OFF INT8 INT8 {
229                 int i = $1;
230                 i = i & ~0x80;
231                 $$ = midi_parser_l_g->note_end_midi_event_p( $1 & ~0x80, $2, $3 );
232         }
233         ;
234
235 note_on:
236         NOTE_ON INT8 INT8 {
237                 int i = $1;
238                 i = i & ~0x90;
239                 $$ = 0;
240                 midi_parser_l_g->note_begin( $1 & ~0x90, $2, $3 );
241         }
242         ;
243
244 polyphonic_aftertouch:
245         POLYPHONIC_AFTERTOUCH INT8 INT8 {
246                 $$ = 0;
247         }
248         ;
249
250 controlmode_change:
251         CONTROLMODE_CHANGE INT8 INT8 {
252                 $$ = 0;
253         }
254         ;
255
256 program_change:
257         PROGRAM_CHANGE INT8 {
258                 $$ = 0;
259         }
260         ;
261
262 channel_aftertouch:
263         CHANNEL_AFTERTOUCH INT8 INT8 {
264                 $$ = 0;
265         }
266         ;
267
268 pitchwheel_range:
269         PITCHWHEEL_RANGE INT8 INT8 {
270                 $$ = 0;
271         }
272         ;
273
274 sysex_event:
275         SYSEX_EVENT1 DATA {
276                 $$ = 0;
277         }
278         | SYSEX_EVENT2 DATA { // INT8 ?
279                 $$ = 0;
280         }
281         ;