]> git.donarmstrong.com Git - lilypond.git/blob - mi2mu/my-midi-parser.cc
e3a4c988cca4cbc9e0ab8a20f0244dc5423f7a02
[lilypond.git] / mi2mu / my-midi-parser.cc
1 //
2 // my-midi-parser.cc -- implement My_midi_parser
3 //
4 // copyright 1997 Jan Nieuwenhuizen <jan@digicash.com>
5
6 #include "mi2mu.hh"
7
8 void
9 yyerror(char const* sz_l )
10 {
11         midi_parser_l_g->error( sz_l );
12 }
13
14
15 My_midi_parser* midi_parser_l_g = 0;
16
17 My_midi_parser::My_midi_parser( String filename_str, Sources *sources_l )
18 {
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
22
23         defined_ch_C_ = 0;
24         fatal_error_i_ = 0;
25         midi_key_p_ = 0;
26         midi_score_p_ = 0;
27         midi_tempo_p_ = 0;
28         midi_time_p_ = 0;
29         track_i_ = 0;
30         bar_i_ = 1;
31         reset();
32 }
33
34 My_midi_parser::~My_midi_parser()
35 {
36     midi_lexer_l_g = 0; // ugh
37
38         delete midi_lexer_p_;
39         delete midi_key_p_;
40         delete midi_tempo_p_;
41         delete midi_time_p_;
42         delete midi_score_p_;
43 }
44
45 void
46 My_midi_parser::reset()
47 {
48         delete midi_key_p_;
49         midi_key_p_ = new Midi_key( 0, 0 );
50         // useconds per 4: 250000 === 60 4 per minute
51         delete midi_tempo_p_;
52         midi_tempo_p_ = new Midi_tempo( 1000000 );
53         delete midi_time_p_;
54         midi_time_p_ = new Midi_time( 4, 2, 24, 8 );
55         now_i64_ = 0;
56         bar_i_ = 1;
57
58         copyright_str_ = "";
59         track_name_str_ = "";
60         instrument_str_ = "";
61
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;
66 }
67
68 void
69 My_midi_parser::add_score( Midi_score* midi_score_p )
70 {
71         assert( !midi_score_p_ );
72         midi_score_p_ = midi_score_p;
73         track_i_ = 0;
74         bar_i_ = 1;
75 }
76
77 void
78 My_midi_parser::error( char const* sz_l )
79 {
80         midi_lexer_l_g->error( sz_l );
81
82         if ( fatal_error_i_ )
83                 exit( fatal_error_i_ );
84 }
85
86 void
87 My_midi_parser::forward( int i )
88 {
89         if ( Duration_convert::no_quantify_b_s ) {
90                 now_i64_ += i;
91                 return;
92         }
93         while ( i > Duration::division_1_i_s ) {
94                 now_i64_ += Duration::division_1_i_s;
95                 i -= Duration::division_1_i_s;
96         }
97         Duration dur = Duration_convert::ticks2standardised_dur( i );
98         now_i64_ += Duration_convert::dur2ticks_i( dur );
99 }
100
101 Moment
102 My_midi_parser::mom()
103 {
104         return Moment( now_i64_, Duration::division_1_i_s );
105 }
106
107 void
108 My_midi_parser::note_begin( int channel_i, int pitch_i, int dyn_i )
109 {
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_;
114 }
115
116 Midi_event*
117 My_midi_parser::note_end_midi_event_p( int channel_i, int pitch_i, int dyn_i )
118 {
119         I64 start_i64 = running_i64_i64_a_[ channel_i ][ pitch_i ];
120
121 //      running_i64_i64_a_[ channel_i ][ pitch_i ] = -1;
122 //      assert( start_i64 != -1 ); // did we start?
123
124         Duration dur( 0 );
125         if ( Duration_convert::no_quantify_b_s )
126                 dur = Duration_convert::ticks2_dur( (I64)now_i64_ - start_i64 );
127         else {
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 ) );
134                 }
135         }
136         return new Midi_note( midi_key_p_->notename_str( pitch_i ), dur );
137 }
138
139 int
140 My_midi_parser::output_mudela( String filename_str )
141 {
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 );
146 }
147
148 int
149 My_midi_parser::parse()
150 {
151         tor( NORMAL_ver ) << "\nParsing..." << flush;
152         return ::yyparse();
153 }
154
155 void
156 My_midi_parser::set_division_4( int division_4_i )
157 {
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" );
162 }
163
164 void
165 My_midi_parser::set_key( int accidentals_i, int minor_i )
166 {
167         delete midi_key_p_;
168         midi_key_p_ = new Midi_key( accidentals_i, minor_i );
169 }
170
171 void
172 My_midi_parser::set_tempo( int useconds_per_4_i )
173 {
174         delete midi_tempo_p_;
175         midi_tempo_p_ = new Midi_tempo( useconds_per_4_i );
176 }
177
178 void
179 My_midi_parser::set_time( int num_i, int den_i, int clocks_i, int count_32_i )
180 {
181         delete midi_time_p_;
182         midi_time_p_ = new Midi_time( num_i, den_i, clocks_i, count_32_i );
183 }
184