]> git.donarmstrong.com Git - lilypond.git/blob - mi2mu/midi-parser.y
7fab7a910d3454643e45ce0f341d44829819af39
[lilypond.git] / mi2mu / midi-parser.y
1 %{
2
3 #include "mi2mu.hh"
4
5 #ifndef NDEBUG
6 #define YYDEBUG 1
7 #endif
8
9 %}
10
11 %union {
12     Byte byte;
13     char c;
14     int i;
15     String* str_p;
16     Request* request_p;
17     Midi_event* midi_event_p;   // Voice_element* ?
18     Midi_score* midi_score_p;   // Input_score* ?
19     Midi_track* midi_track_p;   // Input_music* ?
20 }
21
22 %token HEADER TRACK
23 %token SYSEX_EVENT1 SYSEX_EVENT2
24 %token META_EVENT
25 %token SEQUENCE
26 %token END_OF_TRACK TEMPO SMPTE_OFFSET TIME KEY SSME
27
28 %token<i> I8 U8 INT16 INT32 INT7_8UNSET INT7_8SET VARINT
29 %token<i> RUNNING_STATUS DATA_ENTRY ALL_NOTES_OFF
30 %token<i> NOTE_OFF NOTE_ON 
31 %token<i> POLYPHONIC_AFTERTOUCH CONTROLMODE_CHANGE PROGRAM_CHANGE 
32 %token<i> CHANNEL_AFTERTOUCH PITCHWHEEL_RANGE
33 %token<i> YYTEXT YYCOPYRIGHT YYTRACK_NAME YYINSTRUMENT_NAME YYLYRIC YYMARKER YYCUE_POINT
34 %token<str_p> DATA
35
36 %type <i> varint
37 %type <midi_score_p> header midi_score
38 %type <midi_track_p> track
39 %type <midi_event_p> event
40 %type <midi_event_p> the_event meta_event the_meta_event text_event midi_event sysex_event
41 %type <midi_event_p> running_status data_entry all_notes_off
42 %type <midi_event_p> note_off note_on
43 %type <midi_event_p> polyphonic_aftertouch controlmode_change program_change
44 %type <midi_event_p> channel_aftertouch pitchwheel_range
45
46 %%
47
48 midi:   /* empty */
49         | midi midi_score {
50                 midi_parser_l_g->add_score( $2 );               
51         }
52         ;
53
54 midi_score:
55         header {
56         }
57         | midi_score track {
58                 $$->add_track( $2 );
59                 // ugh
60                 $2->set_tempo( midi_parser_l_g->midi_tempo_p_->useconds_per_4_i() );
61                 $2->set_time( midi_parser_l_g->midi_time_p_->num_i(), 
62                         midi_parser_l_g->midi_time_p_->den_i(), 
63                         midi_parser_l_g->midi_time_p_->clocks_1_i(), 
64                         8 );
65                 if ( midi_parser_l_g->copyright_str_.length_i() )
66                         $2->copyright_str_ = midi_parser_l_g->copyright_str_;
67                 if ( midi_parser_l_g->track_name_str_.length_i() )
68                         $2->name_str_ = midi_parser_l_g->track_name_str_;
69                 if ( midi_parser_l_g->instrument_str_.length_i() )
70                         $2->instrument_str_ = midi_parser_l_g->instrument_str_;
71                 midi_parser_l_g->reset();
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_4( $5 );
79         }
80         ;
81
82 track: 
83         TRACK INT32 {
84                 tor( NORMAL_ver ) << "\ntrack " << midi_parser_l_g->track_i_ << ": " << flush;
85                 $$ = new Midi_track( midi_parser_l_g->track_i_++,
86                         // silly, cause not set yet!
87                         midi_parser_l_g->copyright_str_,
88                         midi_parser_l_g->track_name_str_,
89                         midi_parser_l_g->instrument_str_ );
90         }
91         | track event {
92                 $$->add_event( midi_parser_l_g->mom(), $2 );
93         }
94         ;
95
96 event:  
97         varint the_event {
98                 $$ = $2;
99                 if ( $2 ) {
100                         String str = $2->mudela_str( false );
101                         if ( str.length_i() )
102                                 tor( DEBUG_ver ) << str << " " << flush;
103                 }
104         }
105         ;
106         
107 varint:
108         VARINT {
109                 midi_parser_l_g->forward( $1 );
110                 if ( $1 ) {
111                         int bars_i = (int)( midi_parser_l_g->mom() / midi_parser_l_g->midi_time_p_->bar_mom() );
112                         if ( bars_i > midi_parser_l_g->bar_i_ ) {
113                                 tor( NORMAL_ver ) << '[' << midi_parser_l_g->bar_i_ << ']' << flush; 
114                         midi_parser_l_g->bar_i_ = bars_i;       
115                         }
116                 }
117         }
118         ;
119
120 the_event: 
121         meta_event { 
122         }
123         | midi_event {
124         }
125         | sysex_event {
126         }
127         ;
128
129 meta_event:
130         META_EVENT the_meta_event {
131                 $$ = $2;
132         }
133         |
134         META_EVENT U8 U8 U8 {
135                 $$ = 0;
136         }
137         ;
138
139 the_meta_event:
140         SEQUENCE INT16 {
141         }
142         | text_event DATA {
143                 Midi_text::Type type = (Midi_text::Type)$1;
144                 $$ = 0;
145                 switch ( type )
146                         {
147                         case Midi_text::COPYRIGHT:
148                                 midi_parser_l_g->copyright_str_ = *$2;
149                                 break;
150                         case Midi_text::TRACK_NAME:
151                                 midi_parser_l_g->track_name_str_ = *$2;
152                                 while ( midi_parser_l_g->track_name_str_.index_i( ' ' ) != -1 )
153                                         *(midi_parser_l_g->track_name_str_.ch_l() + midi_parser_l_g->track_name_str_.index_i( ' ' ) ) = '_';
154                                 break;
155                         case Midi_text::INSTRUMENT_NAME:
156                                 midi_parser_l_g->instrument_str_ = *$2;
157                                 break;
158                         default:
159                                 $$ = new Midi_text( type, *$2 );
160                                 break;
161                         }
162                 tor( DEBUG_ver ) << *$2 << endl;
163                 delete $2;
164         }
165         | END_OF_TRACK {
166                 $$ = 0;
167         }
168         | TEMPO U8 U8 U8 { 
169                 $$ = new Midi_tempo( ( $2 << 16 ) + ( $3 << 8 ) + $4 );
170                 tor( DEBUG_ver ) << $$->mudela_str( false ) << endl;
171                 midi_parser_l_g->set_tempo( ( $2 << 16 ) + ( $3 << 8 ) + $4 );
172         }
173         | SMPTE_OFFSET U8 U8 U8 U8 U8 { 
174                 $$ = 0;
175         }
176         | TIME U8 U8 U8 U8 { 
177                 $$ = new Midi_time( $2, $3, $4, $5 );
178                 tor( DEBUG_ver ) << $$->mudela_str( true ) << endl;
179                 midi_parser_l_g->set_time( $2, $3, $4, $5 );
180         }
181         | KEY I8 I8 { 
182                 $$ = new Midi_key( $2, $3 );
183                 midi_parser_l_g->set_key( $2, $3  );
184         }
185         | SSME DATA {
186                 $$ = new Midi_text( (Midi_text::Type)0, *$2 );
187                 delete $2;
188         }
189         ;
190
191 text_event: 
192         YYTEXT {
193                 tor( DEBUG_ver ) << "\n% Text: ";
194         }
195         | YYCOPYRIGHT {
196                 tor( DEBUG_ver ) << "\n% Copyright: ";
197         }
198         | YYTRACK_NAME {
199                 tor( DEBUG_ver ) << "\n% Track  name: ";
200         }
201         | YYINSTRUMENT_NAME {
202                 tor( DEBUG_ver ) << "\n% Instrument  name: ";
203         }
204         | YYLYRIC {
205                 tor( DEBUG_ver ) << "\n% Lyric: ";
206         }
207         | YYMARKER {
208                 tor( DEBUG_ver ) << "\n% Marker: ";
209         }
210         | YYCUE_POINT {
211                 tor( DEBUG_ver ) << "\n% Cue point: ";
212         }
213         ;
214
215 midi_event: 
216         running_status {
217         }
218         | data_entry {
219         }
220         | all_notes_off {
221         }
222         | note_off {
223         }
224         | note_on {
225         }
226         | polyphonic_aftertouch {
227         }
228         | controlmode_change {
229         }
230         | program_change {
231         }
232         | channel_aftertouch {
233         }
234         | pitchwheel_range {
235         }
236         ;
237
238 running_status:
239         RUNNING_STATUS U8 { //U8 {
240                 $$ = 0;
241         }
242         ;
243
244 data_entry:
245         DATA_ENTRY U8 {
246                 $$ = 0;
247         }
248         ;
249
250 all_notes_off:
251         ALL_NOTES_OFF U8 U8 {
252                 $$ = 0;
253         }
254         ;
255
256 note_off:
257         NOTE_OFF U8 U8 {
258                 int i = $1;
259                 i = i & ~0x80;
260                 $$ = midi_parser_l_g->note_end_midi_event_p( $1 & ~0x80, $2, $3 );
261         }
262         ;
263
264 note_on:
265         NOTE_ON U8 U8 {
266                 int i = $1;
267                 i = i & ~0x90;
268                 $$ = 0;
269                 midi_parser_l_g->note_begin( $1 & ~0x90, $2, $3 );
270         }
271         ;
272
273 polyphonic_aftertouch:
274         POLYPHONIC_AFTERTOUCH U8 U8 {
275                 $$ = 0;
276         }
277         ;
278
279 controlmode_change:
280         CONTROLMODE_CHANGE U8 U8 {
281                 $$ = 0;
282         }
283         ;
284
285 program_change:
286         PROGRAM_CHANGE U8 {
287                 $$ = 0;
288         }
289         ;
290
291 channel_aftertouch:
292         CHANNEL_AFTERTOUCH U8 U8 {
293                 $$ = 0;
294         }
295         ;
296
297 pitchwheel_range:
298         PITCHWHEEL_RANGE U8 U8 {
299                 $$ = 0;
300         }
301         ;
302
303 sysex_event:
304         SYSEX_EVENT1 DATA {
305                 $$ = 0;
306         }
307         | SYSEX_EVENT2 DATA { // U8 ?
308                 $$ = 0;
309         }
310         ;