6 #include "midi-parser.hh"
8 #define YY_USER_ACTION char_count_ += YYLeng(); // ugh
15 %option yyclass="My_midi_lexer"
31 INT7_8UNSET [\x00-\x7f]
33 VARINT {INT7_8SET}{0,3}{INT7_8UNSET}
38 XRUNNING_STATUS [\x30-\x4f]
39 RUNNING_STATUS [\x00-\x5f]
40 DATA_ENTRY [\x60-\x79]
41 ALL_NOTES_OFF [\x7a-\x7f]
44 POLYPHONIC_AFTERTOUCH [\xa0-\xaf]
45 CONTROLMODE_CHANGE [\xb0-\xbf]
46 PROGRAM_CHANGE [\xc0-\xcf]
47 CHANNEL_AFTERTOUCH [\xd0-\xdf]
48 PITCHWHEEL_RANGE [\xe0-\xef]
59 YYINSTRUMENT_NAME [\x04]
64 END_OF_TRACK [\x2f][\x00]
66 SMPTE_OFFSET [\x54][\x05]
73 {HEADER}/{INT32} { // using /{INT32}; longer match than {INT32}
74 tor( DEBUG_ver ) << "lex: header" << endl;
75 yy_push_state( int16 );
76 yy_push_state( int16 );
77 yy_push_state( int16 );
78 yy_push_state( int32 );
82 {TRACK}/{INT32} { // using /{INT32}; longer match than {INT32}
83 tor( DEBUG_ver ) << "lex: track" << endl;
84 yy_push_state( track );
85 yy_push_state( int32 );
89 error( String( "top level: illegal byte: " )
90 + String_convert::bin2hex_str( String( *YYText() ) ) );
93 <int32>{INT32} { // really signed?
94 tor( DEBUG_ver ) << "lex: int32" << endl;
95 assert( YYLeng() == 4 );
96 String str( (Byte const*)YYText(), YYLeng() );
97 yylval.i = String_convert::bin2_i( str );
101 <int16>{INT16} { // really signed?
102 tor( DEBUG_ver ) << "lex: int16" << endl;
103 assert( YYLeng() == 2 );
104 String str( (Byte const*)YYText(), YYLeng() );
105 yylval.i = String_convert::bin2_i( str );
110 tor( DEBUG_ver ) << "lex: i8" << endl;
111 assert( YYLeng() == 1 );
112 // yylval.byte = *(signed char*)YYText();
113 yylval.i = *(signed char*)YYText();
118 tor( DEBUG_ver ) << "lex: u8" << endl;
119 assert( YYLeng() == 1 );
120 // yylval.byte = *(Byte*)YYText();
121 yylval.i = *(Byte*)YYText();
127 String str( (Byte const*)YYText(), YYLeng() );
128 yylval.i = My_midi_lexer::varint2_i( str );
129 tor( DEBUG_ver ) << String( "lex: track: varint(" )
130 + String( yylval.i ) + "): "
131 + String_convert::bin2hex_str( str ) << endl;
132 yy_push_state( event );
136 error( String( "track: illegal byte: " )
137 + String_convert::bin2hex_str( String( *YYText() ) ) );
140 <event>{RUNNING_STATUS} {
141 // yylval.byte = *(Byte*)YYText();
142 yylval.i = *(Byte*)YYText();
143 tor( DEBUG_ver ) << String ( "lex: running status: " ) + String( yylval.i ) << endl;
145 // yy_push_state( u8 );
147 return RUNNING_STATUS;
149 <event>{DATA_ENTRY} {
150 // yylval.byte = *(Byte*)YYText();
151 yylval.i = *(Byte*)YYText();
152 tor( DEBUG_ver ) << String ( "lex: undefined data entry: " ) + String( yylval.i ) << endl;
157 <event>{ALL_NOTES_OFF} {
158 tor( DEBUG_ver ) << "lex: all note off" << endl;
159 // yylval.byte = *(Byte*)YYText();
160 yylval.i = *(Byte*)YYText();
161 tor( DEBUG_ver ) << String ( "lex: all notes off: " ) + String( yylval.i ) << endl;
165 return ALL_NOTES_OFF;
168 tor( DEBUG_ver ) << "lex: note off" << endl;
169 // yylval.byte = *(Byte*)YYText();
170 yylval.i = *(Byte*)YYText();
177 tor( DEBUG_ver ) << "lex: note on" << endl;
178 // yylval.byte = *(Byte*)YYText();
179 yylval.i = *(Byte*)YYText();
185 <event>{POLYPHONIC_AFTERTOUCH} {
186 tor( DEBUG_ver ) << "lex: polyphonic aftertouch" << endl;
187 // yylval.byte = *(Byte*)YYText();
188 yylval.i = *(Byte*)YYText();
192 return POLYPHONIC_AFTERTOUCH;
194 <event>{CONTROLMODE_CHANGE} {
195 tor( DEBUG_ver ) << "lex: controlmode change" << endl;
196 // yylval.byte = *(Byte*)YYText();
197 yylval.i = *(Byte*)YYText();
201 return CONTROLMODE_CHANGE;
203 <event>{PROGRAM_CHANGE} {
204 tor( DEBUG_ver ) << "lex: program change" << endl;
205 // yylval.byte = *(Byte*)YYText();
206 yylval.i = *(Byte*)YYText();
209 return PROGRAM_CHANGE;
211 <event>{CHANNEL_AFTERTOUCH} {
212 tor( DEBUG_ver ) << "lex: channel aftertouch" << endl;
213 // yylval.byte = *(Byte*)YYText();
214 yylval.i = *(Byte*)YYText();
218 return CHANNEL_AFTERTOUCH;
220 <event>{PITCHWHEEL_RANGE} {
221 tor( DEBUG_ver ) << "lex: pitchwheel range" << endl;
222 // yylval.byte = *(Byte*)YYText();
223 yylval.i = *(Byte*)YYText();
227 return PITCHWHEEL_RANGE;
229 <event>{SYSEX_EVENT1} { // len data
230 tor( DEBUG_ver ) << "lex: sysex1" << endl;
232 yy_push_state( data );
235 <event>{SYSEX_EVENT2} { // len data
236 tor( DEBUG_ver ) << "lex: sysex2" << endl;
238 // yy_push_state( u8 ); //?
239 yy_push_state( data );
242 <event>{META_EVENT} {
243 tor( DEBUG_ver ) << "lex: meta" << endl;
244 yy_push_state( meta_event );
248 error( String( "event: illegal byte: " )
249 + String_convert::bin2hex_str( String( *YYText() ) ) );
252 <meta_event>{SEQUENCE} { // ssss sequence number
253 tor( DEBUG_ver ) << "lex: sequence" << endl;
256 yy_push_state( int16 );
259 <meta_event>{YYTEXT} { // len data
260 tor( DEBUG_ver ) << "lex: text" << endl;
261 // yylval.byte = *(Byte*)YYText();
262 yylval.i = *(Byte*)YYText();
265 yy_push_state( data );
268 <meta_event>{YYCOPYRIGHT} {
269 tor( DEBUG_ver ) << "lex: copyright" << endl;
270 // yylval.byte = *(Byte*)YYText();
271 yylval.i = *(Byte*)YYText();
274 yy_push_state( data );
277 <meta_event>{YYTRACK_NAME} {
278 tor( DEBUG_ver ) << "lex: track name" << endl;
279 // yylval.byte = *(Byte*)YYText();
280 yylval.i = *(Byte*)YYText();
283 yy_push_state( data );
286 <meta_event>{YYINSTRUMENT_NAME} {
287 tor( DEBUG_ver ) << "lex: instrument name" << endl;
288 // yylval.byte = *(Byte*)YYText();
289 yylval.i = *(Byte*)YYText();
292 yy_push_state( data );
293 return YYINSTRUMENT_NAME;
295 <meta_event>{YYLYRIC} {
296 tor( DEBUG_ver ) << "lex: lyric" << endl;
297 // yylval.byte = *(Byte*)YYText();
298 yylval.i = *(Byte*)YYText();
301 yy_push_state( data );
304 <meta_event>{YYMARKER} {
305 tor( DEBUG_ver ) << "lex: marker" << endl;
306 // yylval.byte = *(Byte*)YYText();
307 yylval.i = *(Byte*)YYText();
310 yy_push_state( data );
313 <meta_event>{YYCUE_POINT} {
314 tor( DEBUG_ver ) << "lex: cue point" << endl;
315 // yylval.byte = *(Byte*)YYText();
316 yylval.i = *(Byte*)YYText();
319 yy_push_state( data );
322 <meta_event>{TEMPO} { // tttttt usec
323 tor( DEBUG_ver ) << "lex: tempo" << endl;
331 <meta_event>{SMPTE_OFFSET} { // hr mn se fr ff
332 tor( DEBUG_ver ) << "lex: smpte offset" << endl;
342 <meta_event>{TIME} { // nn dd cc bb
343 tor( DEBUG_ver ) << "lex: time" << endl;
352 <meta_event>{KEY} { // sf mi
353 tor( DEBUG_ver ) << "lex: key" << endl;
360 <meta_event>{SSME} { // len data
361 tor( DEBUG_ver ) << "lex: smme" << endl;
364 yy_push_state( data );
367 <meta_event>{END_OF_TRACK} {
368 tor( DEBUG_ver ) << "lex: end of track" << endl;
375 warning( String( "meta_event: unimplemented event: " )
376 + String_convert::bin2hex_str( String( *YYText() ) ),
386 tor( DEBUG_ver ) << "lex: data" << endl;
387 String str( (Byte const*)YYText(), YYLeng() );
388 int i = My_midi_lexer::varint2_i( str );
389 String* str_p = new String;
391 *str_p += (char)yyinput();
392 yylval.str_p = str_p;
397 error( String( "data: illegal byte: " )
398 + String_convert::bin2hex_str( String( *YYText() ) ) );
403 // tor( NORMAL_ver ) << "<<EOF>>";
406 yyterminate(); // can't move this, since it actually rets a YY_NULL