]> git.donarmstrong.com Git - lilypond.git/blob - mi2mu/my-midi-parser.cc
release: 0.0.41
[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 )
18 {
19         midi_parser_l_g = this;
20         filename_str_ = filename_str;
21         midi_lexer_p_ = new My_midi_lexer( filename_str_ );
22         defined_ch_c_l_ = 0;
23         fatal_error_i_ = 0;
24         midi_key_p_ = 0;
25         midi_score_p_ = 0;
26         midi_tempo_p_ = 0;
27         midi_time_p_ = 0;
28         track_i_ = 0;
29         bar_i_ = 1;
30         reset();
31 }
32
33 My_midi_parser::~My_midi_parser()
34 {
35         delete midi_lexer_p_;
36         midi_parser_l_g = 0;
37         delete midi_key_p_;
38         delete midi_tempo_p_;
39         delete midi_time_p_;
40         delete midi_score_p_;
41 }
42
43 void
44 My_midi_parser::reset()
45 {
46         delete midi_key_p_;
47         midi_key_p_ = new Midi_key( 0, 0 );
48         // useconds per 4: 250000 === 60 4 per minute
49         delete midi_tempo_p_;
50         midi_tempo_p_ = new Midi_tempo( 1000000 );
51         delete midi_time_p_;
52         midi_time_p_ = new Midi_time( 4, 2, 24, 8 );
53         now_i64_ = 0;
54         bar_i_ = 1;
55
56         copyright_str_ = "";
57         track_name_str_ = "";
58         instrument_str_ = "";
59
60         for ( int i = 0; i < CHANNELS_i; i++ )
61                 for ( int j = 0; j < PITCHES_i; j++ )
62 //                      running_i64_i64_a_[ i ][ j ] = -1;
63                         running_i64_i64_a_[ i ][ j ] = 0;
64 }
65
66 void
67 My_midi_parser::add_score( Midi_score* midi_score_p )
68 {
69         assert( !midi_score_p_ );
70         midi_score_p_ = midi_score_p;
71         track_i_ = 0;
72         bar_i_ = 1;
73 }
74
75 void
76 My_midi_parser::error( char const* sz_l )
77 {
78         midi_lexer_l_g->error( sz_l );
79
80         if ( fatal_error_i_ )
81                 exit( fatal_error_i_ );
82 }
83
84 void
85 My_midi_parser::forward( int i )
86 {
87         now_i64_ += i;
88 }
89
90 Moment
91 My_midi_parser::mom()
92 {
93         return Moment( now_i64_, Duration::division_1_i_s );
94 }
95
96 void
97 My_midi_parser::note_begin( int channel_i, int pitch_i, int dyn_i )
98 {
99         // one pitch a channel at time!
100         // heu, what about { < c2 >  < c4 d4 > }
101 //      assert( running_i64_i64_a_[ channel_i ][ pitch_i ]  == -1 );
102         running_i64_i64_a_[ channel_i ][ pitch_i ] = now_i64_;
103 }
104
105 Midi_event*
106 My_midi_parser::note_end_midi_event_p( int channel_i, int pitch_i, int dyn_i )
107 {
108         I64 start_i64 = running_i64_i64_a_[ channel_i ][ pitch_i ];
109
110 //      running_i64_i64_a_[ channel_i ][ pitch_i ] = -1;
111 //      assert( start_i64 != -1 ); // did we start?
112
113         Duration dur( 0 );
114         if ( Duration_convert::be_blonde_b_s )
115                 dur = Duration_convert::ticks2_dur( (I64)now_i64_ - start_i64 );
116         else
117                 dur = Duration_convert::ticks2standardised_dur( (I64)now_i64_ - start_i64 );
118         return new Midi_note( midi_key_p_->notename_str( pitch_i ), dur );
119 }
120
121 int
122 My_midi_parser::output_mudela( String filename_str )
123 {
124         assert( midi_score_p_ );
125         mtor << "\nProcessing..." << endl;
126         midi_score_p_->process();
127         return midi_score_p_->output_mudela( filename_str );
128 }
129
130 int
131 My_midi_parser::parse()
132 {
133         mtor << "\nParsing..." << flush;
134         return ::yyparse();
135 }
136
137 void
138 My_midi_parser::set_division_4( int division_4_i )
139 {
140         division_1_i_ = division_4_i * 4;
141         Duration::division_1_i_s = division_1_i_;
142         if ( division_4_i < 0 )
143                 warning( "seconds iso metrical time" , 0 );
144 }
145
146 void
147 My_midi_parser::set_key( int accidentals_i, int minor_i )
148 {
149         delete midi_key_p_;
150         midi_key_p_ = new Midi_key( accidentals_i, minor_i );
151 }
152
153 void
154 My_midi_parser::set_tempo( int useconds_per_4_i )
155 {
156         delete midi_tempo_p_;
157         midi_tempo_p_ = new Midi_tempo( useconds_per_4_i );
158 }
159
160 void
161 My_midi_parser::set_time( int num_i, int den_i, int clocks_i, int count_32_i )
162 {
163         delete midi_time_p_;
164         midi_time_p_ = new Midi_time( num_i, den_i, clocks_i, count_32_i );
165 }
166