]> git.donarmstrong.com Git - lilypond.git/blob - src/midi-parser.y
release: 0.0.34
[lilypond.git] / src / midi-parser.y
1 %{
2
3 #include <iostream.h>
4
5 #include "my-midi-lexer.hh"
6 #include "my-midi-parser.hh"
7 #include "midi-event.hh"
8 #include "midi-track.hh"
9 #include "midi-score.hh"
10
11 #ifndef NDEBUG
12 #define YYDEBUG 1
13 #endif
14
15 %}
16
17 %union {
18     Byte byte;
19     char c;
20     int i;
21     String* str_p;
22     Request* request_p;
23     Midi_event* midi_event_p;   // Voice_element* ?
24     Midi_score* midi_score_p;   // Input_score* ?
25     Midi_track* midi_track_p;   // Input_music* ?
26 }
27
28 %token HEADER TRACK
29 %token SYSEX_EVENT1 SYSEX_EVENT2
30 %token META_EVENT
31 %token SEQUENCE TEXT COPYRIGHT TRACK_NAME INSTRUMENT_NAME LYRIC MARKER CUE_POINT
32 %token END_OF_TRACK TEMPO SMPTE_OFFSET TIME KEY SSME
33
34 %token<i> INT8 INT16 INT32 INT7_8UNSET INT7_8SET VARINT
35 %token<i> RUNNING_STATUS NOTE_OFF NOTE_ON PROGRAM_CHANGE
36 %token<str_p> DATA
37
38 %type <midi_score_p> header midi_score
39 %type <midi_track_p> track
40 %type <midi_event_p> event
41 %type <midi_event_p> the_event meta_event text_event midi_event sysex_event
42 %type <midi_event_p> running_status note_off note_on program_change
43
44 %%
45
46 midi:   /* empty */
47         | midi midi_score {
48                 midi_parser_l_g->add_score( $2 );               
49         }
50         ;
51
52 midi_score:
53         header {
54         }
55         | midi_score track {
56                 $$->add_track( $2 );
57         }
58         ;
59
60 header: 
61         HEADER INT32 INT16 INT16 INT16 {
62                 $$ = new Midi_score( $3, $4, $5 );
63         }
64         ;
65
66 track: 
67         TRACK INT32 {
68                 $$ = new Midi_track;
69         }
70         | track event {
71                 $$->add_event( $2 );
72         }
73         ;
74
75 event:  
76         VARINT the_event {
77         }
78         ;
79         
80 the_event: 
81         meta_event {
82         }
83         | midi_event {
84         }
85         | sysex_event {
86         }
87         ;
88
89 meta_event:
90         META_EVENT the_meta_event {
91         };
92
93 the_meta_event:
94         SEQUENCE INT16 {
95         }
96         | text_event DATA {
97         }
98         | END_OF_TRACK {
99         }
100         | TEMPO INT8 INT8 INT8 { 
101         }
102         | SMPTE_OFFSET INT8 INT8 INT8 INT8 INT8 { 
103         }
104         | TIME INT8 INT8 INT8 INT8 { 
105         }
106         | KEY INT8 INT8 { 
107         }
108         | SSME DATA {
109         }
110         ;
111
112 text_event: 
113         TEXT {
114         }
115         | COPYRIGHT {
116         }
117         | TRACK_NAME {
118         }
119         | INSTRUMENT_NAME {
120         }
121         | LYRIC {
122         }
123         | MARKER {
124         }
125         | CUE_POINT {
126         }
127         ;
128
129 midi_event: 
130         running_status {
131         }
132         | note_off {
133         }
134         | note_on {
135         }
136         | program_change {
137         }
138         ;
139
140 running_status:
141         RUNNING_STATUS {
142         }
143         ;
144
145 note_off:
146         NOTE_OFF INT8 INT8 {
147         }
148         ;
149
150 note_on:
151         NOTE_ON INT8 INT8 {
152                 int pitch_i = $2;
153                 // assuming key of C
154                 String notename_str = ( pitch_i % 12 )[ "ccddeffggaab" ];
155                 static int accidental_i_a[ 12 ] = { 0, 1, 0, 1, 0, 0, 1, 0, 1, 0, 1, 0 };
156                 int accidental_i = accidental_i_a[ pitch_i % 12 ];
157                 if ( accidental_i == 1 )
158                         notename_str += "is";
159                 cout << "note(" << pitch_i << "): " << notename_str << endl;
160         }
161         ;
162
163 program_change:
164         PROGRAM_CHANGE {
165         }
166         ;
167
168 sysex_event:
169         SYSEX_EVENT1 {
170         }
171         | SYSEX_EVENT2 {
172         }
173         ;