1 /*MIDIMIDIMIDIMIDIMIDIMIDIMIDIMIDIMIDIMIDIMIDIMIDIMIDIMIDIMIDIMIDIMIDI
4 (/dev/umixiX.Y Direct MIDI Player)
6 Copyright(C) 2014 Koine Yuusuke(koinec). All rights reserved.
8 Redistribution and use in source and binary forms, with or without
9 modification, are permitted provided that the following conditions are met:
11 1. Redistributions of source code must retain the above copyright notice,
12 this list of conditions and the following disclaimer.
13 2. Redistributions in binary form must reproduce the above copyright
14 notice, this list of conditions and the following disclaimer in the
15 documentation and/or other materials provided with the distribution.
17 THIS SOFTWARE IS PROVIDED BY Koine Yuusuke(koinec) ``AS IS'' AND ANY
18 EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
19 WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
20 DISCLAIMED. IN NO EVENT SHALL Koine Yuusuke(koinec) OR CONTRIBUTORS BE
21 LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
22 CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
23 SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
24 INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
25 CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
26 ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
27 OF THE POSSIBILITY OF SUCH DAMAGE.
29 MIDIMIDIMIDIMIDIMIDIMIDIMIDIMIDIMIDIMIDIMIDIMIDIMIDIMIDIMIDIMIDIMIDI*/
38 /* ===================================================================*/
47 *(pb_value + 0) = 0x00;
48 *(pb_value + 1) = 0x00;
49 *(pb_value + 2) = 0x00;
50 *(pb_value + 3) = 0x00;
54 b_temp = (Byte)(dw_delta & 0x0000007f);
56 if( 0 < i_len ) { b_temp |= 0x80; }
58 b_data[i_len++] = b_temp;
60 }while( dw_delta != 0x00000000 );
62 for( i_cnt = 0; i_cnt < i_len; i_cnt++ ) {
63 *(pb_value + i_cnt) = b_data[ i_len - i_cnt - 1 ];
70 /* ===================================================================*/
72 TrackInfo *p_track_start,
79 MidiEventInfo *p_mevent;
90 p_mevent = MidiEvent_GetMidiEventPointer();
91 assert( NULL != p_mevent );
93 pb_vartop = MidiEvent_GetVarDataPointer();
94 assert( NULL != pb_vartop );
95 pb_vardata = pb_vartop;
97 dw_max_events = MidiEvent_GetMidiEvents();
100 for( i_track = 0; i_track < uw_tracks; i_track++ ) {
101 p_track = (p_track_start + i_track);
102 assert( NULL != p_track );
104 p_track->pb_now = p_track->pb_data;
105 p_track->dw_delta_now = 0;
109 for( ; dw_max_events > 0; dw_max_events-- ) {
111 /* Encode Delta time */
112 dw_delta = p_mevent->dw_delta;
113 for( i_track = 0; i_track < uw_tracks; i_track++ ) {
114 p_track = (p_track_start + i_track);
115 p_track->dw_delta_now += dw_delta;
118 /* Get Current TrackID */
119 i_track = (int)p_mevent->uw_track;
120 p_track = (p_track_start + i_track);
121 assert( NULL != p_track );
123 /* Verify DeltaTime */
124 i_len = EncodeValue( b_value, p_track->dw_delta_now );
126 fprintf(stderr, "Error!!: Fail Verify MidiEvent --" \
127 " [Trk %d] DeltaTime Length = 0\n",
132 i_result = memcmp( b_value, p_track->pb_now, i_len );
133 if( 0 != i_result ) {
134 DecodeValue( &dw_temp, p_track->pb_now );
135 fprintf(stderr, "Error!!: Fail Verify MidiEvent --" \
136 " [Trk %d] DeltaTime: Event:%d(%x %x %x %x) <=> MidiSrc:%d \n",
137 i_track, i_len, b_value[0], b_value[1],
138 b_value[2], b_value[3], dw_temp );
142 p_track->dw_delta_now = 0;
143 p_track->pb_now += i_len;
145 /* Verify MidiEvent */
146 b_status = p_mevent->b_data[0] & 0xf0;
148 if( (SMF_EVENT_NOTEOFF == b_status ) || ( SMF_EVENT_NOTEON == b_status ) ||
149 ( SMF_EVENT_KEYPRESSER == b_status ) || ( SMF_EVENT_CTRLCHANGE == b_status ) ||
150 ( SMF_EVENT_PITCHBEND == b_status ) ) {
152 if( 0x00 != p_mevent->b_run_status ) {
153 b_value[0] = p_mevent->b_data[1];
154 b_value[1] = p_mevent->b_data[2];
157 b_value[0] = p_mevent->b_data[0];
158 b_value[1] = p_mevent->b_data[1];
159 b_value[2] = p_mevent->b_data[2];
164 i_result = memcmp( b_value, p_track->pb_now, i_len );
165 if( 0 != i_result ) {
166 fprintf( stderr, "Error!!: Fail Verify MidiEvent --" \
167 " [Trk %d] 3Byte-Event: Event:%x %x %x <=> MidiSrc:%ld \n",
168 i_track, b_value[0], b_value[1], b_value[2],
169 (p_track->pb_data - p_track->pb_now) );
173 p_track->pb_now += i_len;
175 else if( ( SMF_EVENT_PROGCHANGE == b_status ) ||
176 ( SMF_EVENT_CHNPRESSER == b_status )) {
178 if( 0x00 != p_mevent->b_run_status ) {
179 b_value[0] = p_mevent->b_data[1];
182 b_value[0] = p_mevent->b_data[0];
183 b_value[1] = p_mevent->b_data[1];
188 i_result = memcmp( b_value, p_track->pb_now, i_len );
189 if( 0 != i_result ) {
190 fprintf( stderr, "Error!!: Fail Verify MidiEvent --" \
191 " [Trk %d] 2Byte-Event: Event:%x %x <=> MidiSrc:%ld \n",
192 i_track, b_value[0], b_value[1],
193 (p_track->pb_data - p_track->pb_now) );
197 p_track->pb_now += i_len;
199 else if( SMF_EVENT_SYSEX_META == b_status ) {
201 b_status = p_mevent->b_data[0];
202 if( SMF_EVENT_SYSEX_F0 == b_status ) {
205 if( p_mevent->b_data[0] != *p_track->pb_now ) {
206 fprintf( stderr, "Error!!: Fail Verify MidiEvent --" \
207 " [Trk %d] SysEx(F0) Status: Code:%x <=> MidiSrc:%ld \n",
208 i_track, p_mevent->b_data[0], (p_track->pb_data - p_track->pb_now) );
214 i_len = EncodeValue( b_value, (p_mevent->dw_length - 1) );
215 i_result = memcmp( b_value, p_track->pb_now, i_len );
216 if( 0 != i_result ) {
217 fprintf( stderr, "Error!!: Fail Verify MidiEvent --" \
218 " [Trk %d] SysEx(F0) Size: Code:%d(%x %x %x %x)<=> MidiSrc:%ld \n",
219 i_track, p_mevent->dw_length, b_value[0], b_value[1], b_value[2],
220 b_value[3], (p_track->pb_data - p_track->pb_now) );
223 p_track->pb_now += i_len;
225 pb_temp = (pb_vartop + p_mevent->dw_dataptr);
226 if( pb_temp != pb_vardata ) {
227 fprintf( stderr, "Error!!: Fail Verify MidiEvent --" \
228 " [Trk %d] SysEx(F0) VarData Ptr. Error \n", i_track );
232 if( p_mevent->b_data[0] != *pb_temp ) {
233 fprintf( stderr, "Error!!: Fail Verify MidiEvent --" \
234 " [Trk %d] SysEx(F0) Data: First Byte(%x,%x) \n",
235 i_track, p_mevent->b_data[0], *(p_track->pb_now) );
241 i_result = memcmp( pb_temp, p_track->pb_now, p_mevent->dw_length - 1 );
242 if( 0 != i_result ) {
243 fprintf( stderr, "Error!!: Fail Verify MidiEvent --" \
244 " [Trk %d] SysEx(F0) Data: len=%d \n", i_track, i_len );
248 p_track->pb_now += (p_mevent->dw_length - 1);
249 pb_vardata += p_mevent->dw_length;
251 } else if( SMF_EVENT_SYSEX_F7 == b_status ) {
254 if( p_mevent->b_data[0] != *p_track->pb_now ) {
255 fprintf( stderr, "Error!!: Fail Verify MidiEvent --" \
256 " [Trk %d] SysEx(F7) Status: Code:%x <=> MidiSrc:%ld \n",
257 i_track, p_mevent->b_data[0], (p_track->pb_data - p_track->pb_now) );
263 i_len = EncodeValue( b_value, p_mevent->dw_length );
264 i_result = memcmp( b_value, p_track->pb_now, i_len );
265 if( 0 != i_result ) {
266 fprintf( stderr, "Error!!: Fail Verify MidiEvent --" \
267 " [Trk %d] SysEx(F7) Size: Code:%d(%x %x %x %x)<=> MidiSrc:%ld \n",
268 i_track, p_mevent->dw_length, b_value[0], b_value[1], b_value[2],
269 b_value[3], (p_track->pb_data - p_track->pb_now) );
272 p_track->pb_now += i_len;
274 pb_temp = (pb_vartop + p_mevent->dw_dataptr);
275 if( pb_temp != pb_vardata ) {
276 fprintf( stderr, "Error!!: Fail Verify MidiEvent --" \
277 " [Trk %d] SysEx(F7) VarData Ptr. Error \n", i_track );
281 i_result = memcmp( pb_temp, p_track->pb_now, p_mevent->dw_length );
282 if( 0 != i_result ) {
283 fprintf( stderr, "Error!!: Fail Verify MidiEvent --" \
284 " [Trk %d] SysEx(F7) Data: len=%d \n", i_track, i_len );
288 p_track->pb_now += p_mevent->dw_length;
289 pb_vardata += p_mevent->dw_length;
291 } else if( SMF_EVENT_META == b_status ) {
294 if( p_mevent->b_data[0] != *(p_track->pb_now + 0) ) {
295 fprintf( stderr, "Error!!: Fail Verify MidiEvent --" \
296 " [Trk %d] Meta Status: Code:%x <=> MidiSrc:%x \n",
297 i_track, p_mevent->b_data[0], *p_track->pb_now );
302 if( p_mevent->b_data[1] != *(p_track->pb_now + 1) ) {
303 fprintf( stderr, "Error!!: Fail Verify MidiEvent --" \
304 " [Trk %d] Meta Code: Code:%x <=> MidiSrc:%ld \n",
305 i_track, p_mevent->b_data[1], (p_track->pb_data - p_track->pb_now) );
310 i_len = DecodeValue( &dw_temp, (p_track->pb_now + 2) );
312 i_len = EncodeValue( b_value, (p_mevent->dw_length - i_len - 2) );
313 i_result = memcmp( b_value, (p_track->pb_now + 2), i_len );
314 if( 0 != i_result ) {
315 fprintf( stderr, "Error!!: Fail Verify MidiEvent --" \
316 " [Trk %d] Meta Size: Code:%d(%x %x %x %x)<=> MidiSrc:%ld \n",
317 i_track, p_mevent->dw_length, b_value[0], b_value[1], b_value[2],
318 b_value[3], (p_track->pb_data - p_track->pb_now) );
322 pb_temp = (pb_vartop + p_mevent->dw_dataptr);
323 if( pb_temp != pb_vardata ) {
324 fprintf( stderr, "Error!!: Fail Verify MidiEvent --" \
325 " [Trk %d] Meta VarData Ptr. Error \n", i_track );
329 i_result = memcmp( pb_temp, p_track->pb_now, p_mevent->dw_length );
330 if( 0 != i_result ) {
331 fprintf( stderr, "Error!!: Fail Verify MidiEvent --" \
332 " [Trk %d] Meta Data: len=%d \n", i_track, i_len );
336 p_track->pb_now += p_mevent->dw_length;
337 pb_vardata += p_mevent->dw_length;
345 fputs( "Verify MidiEvent is Completed!!\n", stderr );
351 /* EOF of verify_event.c **********************************************/