2 // my-midi-parser.cc -- implement My_midi_parser
4 // copyright 1997 Jan Nieuwenhuizen <jan@digicash.com>
9 yyerror(char const* sz_l )
11 midi_parser_l_g->error( sz_l );
15 My_midi_parser* midi_parser_l_g = 0;
17 My_midi_parser::My_midi_parser( String filename_str, Sources *sources_l )
19 filename_str_ = filename_str;
20 midi_lexer_p_ = new My_midi_lexer( filename_str_,sources_l );
21 midi_lexer_l_g = midi_lexer_p_; // ugh
34 My_midi_parser::~My_midi_parser()
36 midi_lexer_l_g = 0; // ugh
46 My_midi_parser::reset()
49 midi_key_p_ = new Midi_key( 0, 0 );
50 // useconds per 4: 250000 === 60 4 per minute
52 midi_tempo_p_ = new Midi_tempo( 1000000 );
54 midi_time_p_ = new Midi_time( 4, 2, 24, 8 );
62 for ( int i = 0; i < CHANNELS_i; i++ )
63 for ( int j = 0; j < PITCHES_i; j++ )
64 // running_i64_i64_a_[ i ][ j ] = -1;
65 running_i64_i64_a_[ i ][ j ] = 0;
69 My_midi_parser::add_score( Midi_score* midi_score_p )
71 assert( !midi_score_p_ );
72 midi_score_p_ = midi_score_p;
78 My_midi_parser::error( char const* sz_l )
80 midi_lexer_l_g->error( sz_l );
83 exit( fatal_error_i_ );
87 My_midi_parser::forward( int i )
89 if ( Duration_convert::no_quantify_b_s ) {
93 while ( i > Duration::division_1_i_s ) {
94 now_i64_ += Duration::division_1_i_s;
95 i -= Duration::division_1_i_s;
97 Duration dur = Duration_convert::ticks2standardised_dur( i );
98 now_i64_ += Duration_convert::dur2ticks_i( dur );
102 My_midi_parser::mom()
104 return Moment( now_i64_, Duration::division_1_i_s );
108 My_midi_parser::note_begin( int channel_i, int pitch_i, int dyn_i )
110 // one pitch a channel at time!
111 // heu, what about { < c2 > < c4 d4 > }
112 // assert( running_i64_i64_a_[ channel_i ][ pitch_i ] == -1 );
113 running_i64_i64_a_[ channel_i ][ pitch_i ] = now_i64_;
117 My_midi_parser::note_end_midi_event_p( int channel_i, int pitch_i, int dyn_i )
119 I64 start_i64 = running_i64_i64_a_[ channel_i ][ pitch_i ];
121 // running_i64_i64_a_[ channel_i ][ pitch_i ] = -1;
122 // assert( start_i64 != -1 ); // did we start?
125 if ( Duration_convert::no_quantify_b_s )
126 dur = Duration_convert::ticks2_dur( (I64)now_i64_ - start_i64 );
128 dur = Duration_convert::ticks2standardised_dur( (I64)now_i64_ - start_i64 );
129 // checking myself iso using tor saves some time
130 if ( level_ver >= VERBOSE_ver ) {
131 Moment mom( (I64)now_i64_ - start_i64, Duration::division_1_i_s );
132 if ( dur.length() != mom )
133 warning( String( "duration not exact: " ) + String( (Real)mom ) );
136 return new Midi_note( midi_key_p_->notename_str( pitch_i ), dur );
140 My_midi_parser::output_mudela( String filename_str )
142 assert( midi_score_p_ );
143 tor( NORMAL_ver ) << "\nProcessing..." << endl;
144 midi_score_p_->process();
145 return midi_score_p_->output_mudela( filename_str );
149 My_midi_parser::parse()
151 tor( NORMAL_ver ) << "\nParsing..." << flush;
156 My_midi_parser::set_division_4( int division_4_i )
158 division_1_i_ = division_4_i * 4;
159 Duration::division_1_i_s = division_1_i_;
160 if ( division_4_i < 0 )
161 warning( "seconds iso metrical time" );
165 My_midi_parser::set_key( int accidentals_i, int minor_i )
168 midi_key_p_ = new Midi_key( accidentals_i, minor_i );
172 My_midi_parser::set_tempo( int useconds_per_4_i )
174 delete midi_tempo_p_;
175 midi_tempo_p_ = new Midi_tempo( useconds_per_4_i );
179 My_midi_parser::set_time( int num_i, int den_i, int clocks_i, int count_32_i )
182 midi_time_p_ = new Midi_time( num_i, den_i, clocks_i, count_32_i );