3 #include "mi2mu-proto.hh"
7 #include "mi2mu-global.hh"
8 //#include "midi-parser.hh"
9 #include "my-midi-parser.hh"
10 #include "my-midi-lexer.hh"
11 #include "duration-convert.hh"
12 #include "string-convert.hh"
13 #include "mudela-item.hh"
14 #include "mudela-score.hh"
15 #include "mudela-staff.hh"
28 Mudela_item
* mudela_item_p
; // Voice_element* ? jup, just about :-)
29 Mudela_score
* mudela_score_p
; // Input_score* ?
30 Mudela_staff
* mudela_staff_p
; // Input_music* ?
34 %token SYSEX_EVENT1 SYSEX_EVENT2
37 %token END_OF_TRACK TEMPO SMPTE_OFFSET TIME KEY SSME
39 %token
<i
> I8 U8 INT16 INT32 INT7_8UNSET INT7_8SET VARINT
40 %token
<i
> RUNNING_STATUS DATA_ENTRY ALL_NOTES_OFF
41 %token
<i
> NOTE_OFF NOTE_ON
42 %token
<i
> POLYPHONIC_AFTERTOUCH CONTROLMODE_CHANGE PROGRAM_CHANGE
43 %token
<i
> CHANNEL_AFTERTOUCH PITCHWHEEL_RANGE
44 %token
<i
> YYTEXT YYCOPYRIGHT YYTRACK_NAME YYINSTRUMENT_NAME YYLYRIC YYMARKER YYCUE_POINT
48 %type
<mudela_score_p
> header mudela_score
49 %type
<mudela_staff_p
> track
50 %type
<mudela_item_p
> item
51 %type
<mudela_item_p
> the_item meta_item the_meta_item text_item mudela_item sysex_item
52 %type
<mudela_item_p
> running_status data_entry all_notes_off
53 %type
<mudela_item_p
> note_off note_on
54 %type
<mudela_item_p
> polyphonic_aftertouch controlmode_change program_change
55 %type
<mudela_item_p
> channel_aftertouch pitchwheel_range
61 midi_parser_l_g
->add_score
($2);
68 | mudela_score track
{
71 $2->set_tempo
(midi_parser_l_g
->mudela_tempo_p_
->useconds_per_4_i
());
72 $2->set_meter
(midi_parser_l_g
->mudela_meter_p_
->num_i
(),
73 midi_parser_l_g
->mudela_meter_p_
->den_i
(),
74 midi_parser_l_g
->mudela_meter_p_
->clocks_1_i
(),
76 if
(midi_parser_l_g
->copyright_str_.length_i
())
77 $2->copyright_str_
= midi_parser_l_g
->copyright_str_
;
78 if
(midi_parser_l_g
->track_name_str_.length_i
())
79 $2->name_str_
= midi_parser_l_g
->track_name_str_
;
80 if
(midi_parser_l_g
->instrument_str_.length_i
())
81 $2->instrument_str_
= midi_parser_l_g
->instrument_str_
;
82 midi_parser_l_g
->reset
();
87 HEADER INT32 INT16 INT16 INT16
{
88 // ugh, already constructed;
89 // need to have score in My_midi_parser...
90 // $$ = new Mudela_score ($3, $4, $5);
91 $$
= midi_parser_l_g
->mudela_score_p_
;
95 midi_parser_l_g
->set_division_4
($5);
101 LOGOUT
(NORMAL_ver
) << "\ntrack " << midi_parser_l_g
->track_i_
<< ": " << flush
;
102 $$
= new Mudela_staff
(midi_parser_l_g
->track_i_
++,
103 // silly, cause not set yet!
104 midi_parser_l_g
->copyright_str_
,
105 midi_parser_l_g
->track_name_str_
,
106 midi_parser_l_g
->instrument_str_
);
107 //ugh, need to know now!
108 midi_parser_l_g
->mudela_staff_l_
= $$
;
112 $2->mudela_column_l_
= midi_parser_l_g
->mudela_column_l_
;
122 String str
= $2->str
();
124 LOGOUT
(DEBUG_ver
) << str
<< " " << flush
;
131 midi_parser_l_g
->forward
($1);
145 META_EVENT the_meta_item
{
149 META_EVENT U8 U8 U8
{
158 Mudela_text
::Type type
= (Mudela_text
::Type
)$1;
162 case Mudela_text
::COPYRIGHT
:
163 midi_parser_l_g
->copyright_str_
= *$2;
165 case Mudela_text
::TRACK_NAME
:
166 midi_parser_l_g
->track_name_str_
= *$2;
168 case Mudela_text
::INSTRUMENT_NAME
:
169 midi_parser_l_g
->instrument_str_
= *$2;
172 $$
= new Mudela_text
(type
, *$2);
175 LOGOUT
(DEBUG_ver
) << *$2 << endl
;
182 $$
= new Mudela_tempo
( ($2 << 16) + ($3 << 8) + $4);
183 LOGOUT
(DEBUG_ver
) << $$
->str
() << endl
;
184 midi_parser_l_g
->set_tempo
( ($2 << 16) + ($3 << 8) + $4);
186 | SMPTE_OFFSET U8 U8 U8 U8 U8
{
190 $$
= new Mudela_meter
($2, $3, $4, $5);
191 LOGOUT
(DEBUG_ver
) << $$
->str
() << endl
;
192 midi_parser_l_g
->set_meter
($2, $3, $4, $5);
195 $$
= new Mudela_key
($2, $3);
196 midi_parser_l_g
->set_key
($2, $3 );
199 $$
= new Mudela_text
((Mudela_text
::Type
)0, *$2);
206 LOGOUT
(DEBUG_ver
) << "\n% Text: ";
209 LOGOUT
(DEBUG_ver
) << "\n% Copyright: ";
212 LOGOUT
(DEBUG_ver
) << "\n% Track name: ";
214 | YYINSTRUMENT_NAME
{
215 LOGOUT
(DEBUG_ver
) << "\n% Instrument name: ";
218 LOGOUT
(DEBUG_ver
) << "\n% Lyric: ";
221 LOGOUT
(DEBUG_ver
) << "\n% Marker: ";
224 LOGOUT
(DEBUG_ver
) << "\n% Cue point: ";
239 | polyphonic_aftertouch
{
241 | controlmode_change
{
245 | channel_aftertouch
{
252 RUNNING_STATUS mudela_item
{
264 ALL_NOTES_OFF U8 U8
{
265 midi_parser_l_g
->note_end_all
();
274 midi_parser_l_g
->note_end
($1 & ~
0x80, $2, $3);
285 midi_parser_l_g
->note_begin
($1 & ~
0x90, $2, $3);
287 sss: some broken devices encode NOTE_OFF as
288 NOTE_ON with zero volume
291 midi_parser_l_g
->note_end
($1 & ~
0x90, $2, $3);
295 polyphonic_aftertouch:
296 POLYPHONIC_AFTERTOUCH U8 U8
{
302 CONTROLMODE_CHANGE U8 U8
{
314 CHANNEL_AFTERTOUCH U8 U8
{
320 PITCHWHEEL_RANGE U8 U8
{
329 | SYSEX_EVENT2 DATA
{ // U8 ?