8 #include "my-midi-lexer.hh"
9 #include "midi-parser.hh"
11 #ifndef MIDI_LEX_DEBUG
22 %option yyclass="My_midi_lexer"
36 INT7_8UNSET [\x00-\x7f]
38 VARINT {INT7_8SET}{0,3}{INT7_8UNSET}
43 RUNNING_STATUS [\x30-\x4f]
46 PROGRAM_CHANGE [\xc0-\xcf]
57 INSTRUMENT_NAME [\x04]
62 END_OF_TRACK [\x2f][\x00]
64 SMPTE_OFFSET [\x54][\x05]
71 {HEADER}/{INT32} { // using /{INT32}; longer match than {INT32}
72 puts( "lex: header" );
73 yy_push_state( int16 );
74 yy_push_state( int16 );
75 yy_push_state( int16 );
76 yy_push_state( int32 );
80 {TRACK}/{INT32} { // using /{INT32}; longer match than {INT32}
82 yy_push_state( track );
83 yy_push_state( int32 );
89 assert( YYLeng() == 4 );
90 String str( (Byte const*)YYText(), YYLeng() );
91 yylval.i = StringConversion::bin2int_i( str );
97 assert( YYLeng() == 2 );
98 String str( (Byte const*)YYText(), YYLeng() );
99 yylval.i = StringConversion::bin2int_i( str );
105 assert( YYLeng() == 1 );
106 // yylval.byte = *(Byte*)YYText();
107 yylval.i = *(Byte*)YYText();
113 puts( "lex: track: varint" );
114 String str( (Byte const*)YYText(), YYLeng() );
115 yylval.i = My_midi_lexer::varint2int_i( str );
116 yy_push_state( event );
120 <event>{RUNNING_STATUS} {
121 yylval.byte = *(Byte*)YYText();
123 yy_push_state( int8 );
124 return RUNNING_STATUS;
127 puts( "lex: note off" );
128 yylval.byte = *(Byte*)YYText();
130 yy_push_state( int8 );
131 yy_push_state( int8 );
135 puts( "lex: note on" );
136 yylval.byte = *(Byte*)YYText();
138 yy_push_state( int8 );
139 yy_push_state( int8 );
142 <event>{PROGRAM_CHANGE} {
143 yylval.byte = *(Byte*)YYText();
145 yy_push_state( int8 );
146 return PROGRAM_CHANGE;
148 <event>{META_EVENT} {
149 yy_push_state( meta_event );
153 <meta_event>{SEQUENCE} { // ssss sequence number
154 yy_push_state( int16 );
157 <meta_event>{TEXT} { // len data
158 yy_push_state( data );
161 <meta_event>{COPYRIGHT} {
162 yy_push_state( data );
165 <meta_event>{TRACK_NAME} {
166 yy_push_state( data );
169 <meta_event>{INSTRUMENT_NAME} {
170 yy_push_state( data );
171 return INSTRUMENT_NAME;
173 <meta_event>{LYRIC} {
174 yy_push_state( data );
177 <meta_event>{MARKER} {
178 yy_push_state( data );
181 <meta_event>{CUE_POINT} {
182 yy_push_state( data );
185 <meta_event>{TEMPO} { // tttttt usec
186 puts( "lex: tempo" );
189 yy_push_state( int8 );
190 yy_push_state( int8 );
191 yy_push_state( int8 );
194 <meta_event>{SMPTE_OFFSET} { // hr mn se fr ff
197 yy_push_state( int8 );
198 yy_push_state( int8 );
199 yy_push_state( int8 );
200 yy_push_state( int8 );
201 yy_push_state( int8 );
204 <meta_event>{TIME} { // nn dd cc bb
208 yy_push_state( int8 );
209 yy_push_state( int8 );
210 yy_push_state( int8 );
211 yy_push_state( int8 );
214 <meta_event>{KEY} { // sf mi
218 yy_push_state( int8 );
219 yy_push_state( int8 );
222 <meta_event>{SSME} { // len data
225 yy_push_state( data );
228 <meta_event>{END_OF_TRACK} {
229 puts( "lex: end of track" );
236 yylval.byte = *(Byte*)YYText();
241 String str( (Byte const*)YYText(), YYLeng() );
242 int i = My_midi_lexer::varint2int_i( str );
243 String* str_p = new String;
245 *str_p += (char)yyinput();
246 yylval.str_p = str_p;
254 // mtor << "<<EOF>>";
257 yyterminate(); // can't move this, since it actually rets a YY_NULL