16 Midi_event* midi_event_p; // Voice_element* ?
17 Midi_score* midi_score_p; // Input_score* ?
18 Midi_track* midi_track_p; // Input_music* ?
22 %token SYSEX_EVENT1 SYSEX_EVENT2
25 %token END_OF_TRACK TEMPO SMPTE_OFFSET TIME KEY SSME
27 %token<i> I8 U8 INT16 INT32 INT7_8UNSET INT7_8SET VARINT
28 %token<i> RUNNING_STATUS DATA_ENTRY ALL_NOTES_OFF
29 %token<i> NOTE_OFF NOTE_ON
30 %token<i> POLYPHONIC_AFTERTOUCH CONTROLMODE_CHANGE PROGRAM_CHANGE
31 %token<i> CHANNEL_AFTERTOUCH PITCHWHEEL_RANGE
32 %token<i> YYTEXT YYCOPYRIGHT YYTRACK_NAME YYINSTRUMENT_NAME YYLYRIC YYMARKER YYCUE_POINT
36 %type <midi_score_p> header midi_score
37 %type <midi_track_p> track
38 %type <midi_event_p> event
39 %type <midi_event_p> the_event meta_event the_meta_event text_event midi_event sysex_event
40 %type <midi_event_p> running_status data_entry all_notes_off
41 %type <midi_event_p> note_off note_on
42 %type <midi_event_p> polyphonic_aftertouch controlmode_change program_change
43 %type <midi_event_p> channel_aftertouch pitchwheel_range
49 midi_parser_l_g->add_score( $2 );
59 $2->set_tempo( midi_parser_l_g->midi_tempo_p_->useconds_per_4_i() );
60 $2->set_time( midi_parser_l_g->midi_time_p_->num_i(),
61 midi_parser_l_g->midi_time_p_->den_i(),
62 midi_parser_l_g->midi_time_p_->clocks_1_i(),
64 if ( midi_parser_l_g->copyright_str_.length_i() )
65 $2->copyright_str_ = midi_parser_l_g->copyright_str_;
66 if ( midi_parser_l_g->track_name_str_.length_i() )
67 $2->name_str_ = midi_parser_l_g->track_name_str_;
68 if ( midi_parser_l_g->instrument_str_.length_i() )
69 $2->instrument_str_ = midi_parser_l_g->instrument_str_;
70 midi_parser_l_g->reset();
75 HEADER INT32 INT16 INT16 INT16 {
76 $$ = new Midi_score( $3, $4, $5 );
77 midi_parser_l_g->set_division_4( $5 );
83 tor( NORMAL_ver ) << "\ntrack " << midi_parser_l_g->track_i_ << ": " << flush;
84 $$ = new Midi_track( midi_parser_l_g->track_i_++,
85 // silly, cause not set yet!
86 midi_parser_l_g->copyright_str_,
87 midi_parser_l_g->track_name_str_,
88 midi_parser_l_g->instrument_str_ );
91 $$->add_event( midi_parser_l_g->mom(), $2 );
99 String str = $2->mudela_str( false );
100 if ( str.length_i() )
101 tor( DEBUG_ver ) << str << " " << flush;
108 midi_parser_l_g->forward( $1 );
110 int bars_i = (int)( midi_parser_l_g->mom() / midi_parser_l_g->midi_time_p_->bar_mom() );
111 if ( bars_i > midi_parser_l_g->bar_i_ ) {
112 tor( NORMAL_ver ) << '[' << midi_parser_l_g->bar_i_ << ']' << flush;
113 midi_parser_l_g->bar_i_ = bars_i;
129 META_EVENT the_meta_event {
133 META_EVENT U8 U8 U8 {
142 Midi_text::Type type = (Midi_text::Type)$1;
146 case Midi_text::COPYRIGHT:
147 midi_parser_l_g->copyright_str_ = *$2;
149 case Midi_text::TRACK_NAME:
150 midi_parser_l_g->track_name_str_ = *$2;
151 while ( midi_parser_l_g->track_name_str_.index_i( ' ' ) != -1 )
152 *(midi_parser_l_g->track_name_str_.ch_l() + midi_parser_l_g->track_name_str_.index_i( ' ' ) ) = '_';
154 case Midi_text::INSTRUMENT_NAME:
155 midi_parser_l_g->instrument_str_ = *$2;
158 $$ = new Midi_text( type, *$2 );
161 tor( DEBUG_ver ) << *$2 << endl;
168 $$ = new Midi_tempo( ( $2 << 16 ) + ( $3 << 8 ) + $4 );
169 tor( DEBUG_ver ) << $$->mudela_str( false ) << endl;
170 midi_parser_l_g->set_tempo( ( $2 << 16 ) + ( $3 << 8 ) + $4 );
172 | SMPTE_OFFSET U8 U8 U8 U8 U8 {
176 $$ = new Midi_time( $2, $3, $4, $5 );
177 tor( DEBUG_ver ) << $$->mudela_str( true ) << endl;
178 midi_parser_l_g->set_time( $2, $3, $4, $5 );
181 $$ = new Midi_key( $2, $3 );
182 midi_parser_l_g->set_key( $2, $3 );
185 $$ = new Midi_text( (Midi_text::Type)0, *$2 );
192 tor( DEBUG_ver ) << "\n% Text: ";
195 tor( DEBUG_ver ) << "\n% Copyright: ";
198 tor( DEBUG_ver ) << "\n% Track name: ";
200 | YYINSTRUMENT_NAME {
201 tor( DEBUG_ver ) << "\n% Instrument name: ";
204 tor( DEBUG_ver ) << "\n% Lyric: ";
207 tor( DEBUG_ver ) << "\n% Marker: ";
210 tor( DEBUG_ver ) << "\n% Cue point: ";
225 | polyphonic_aftertouch {
227 | controlmode_change {
231 | channel_aftertouch {
238 RUNNING_STATUS midi_event {
250 ALL_NOTES_OFF U8 U8 {
259 $$ = midi_parser_l_g->note_end_midi_event_p( $1 & ~0x80, $2, $3 );
269 midi_parser_l_g->note_begin( $1 & ~0x90, $2, $3 );
271 sss: some broken devices encode NOTE_OFF as
272 NOTE_ON with zero volume
275 $$ = midi_parser_l_g->note_end_midi_event_p( $1 & ~0x90, $2, $3 );
279 polyphonic_aftertouch:
280 POLYPHONIC_AFTERTOUCH U8 U8 {
286 CONTROLMODE_CHANGE U8 U8 {
298 CHANNEL_AFTERTOUCH U8 U8 {
304 PITCHWHEEL_RANGE U8 U8 {
313 | SYSEX_EVENT2 DATA { // U8 ?