#include <fileread.h>
Inheritance diagram for jdkmidi::MIDIFileRead:
Public Member Functions | |
MIDIFileRead (MIDIFileReadStream *input_stream_, MIDIFileEvents *event_handler_, unsigned long max_msg_len=8192) | |
virtual | ~MIDIFileRead () |
virtual bool | Parse () |
int | GetFormat () |
int | GetNumberTracks () |
int | GetDivision () |
Protected Member Functions | |
virtual int | ReadHeader () |
virtual void | mf_error (char *) |
Protected Attributes | |
int | no_merge |
MIDIClockTime | cur_time |
int | skip_init |
unsigned long | to_be_read |
int | cur_track |
int | abort_parse |
unsigned char * | the_msg |
int | max_msg_len |
int | msg_index |
Private Member Functions | |
unsigned long | ReadVariableNum () |
unsigned long | Read32Bit () |
int | Read16Bit () |
void | ReadTrack () |
void | MsgAdd (int) |
void | MsgInit () |
int | EGetC () |
int | ReadMT (unsigned long, int) |
void | BadByte (int) |
void | FormChanMessage (unsigned char st, unsigned char b1, unsigned char b2) |
Private Attributes | |
int | header_format |
int | header_ntrks |
int | header_division |
MIDIFileReadStream * | input_stream |
MIDIFileEvents * | event_handler |
|
Definition at line 319 of file jdkmidi_fileread.cpp. References abort_parse, cur_time, cur_track, max_msg_len, msg_index, no_merge, skip_init, the_msg, and to_be_read.
00324 : 00325 input_stream( input_stream_ ), 00326 event_handler( event_handler_ ) 00327 { 00328 no_merge=0; 00329 cur_time=0; 00330 skip_init=1; 00331 to_be_read=0; 00332 msg_index=0; 00333 cur_track=0; 00334 abort_parse=0; 00335 max_msg_len=max_msg_len_; 00336 the_msg = new unsigned char[max_msg_len]; 00337 } |
|
Definition at line 339 of file jdkmidi_fileread.cpp. References the_msg.
00340 { 00341 delete [] the_msg; 00342 } |
|
Definition at line 690 of file jdkmidi_fileread.cpp. References abort_parse, and mf_error().
00691 { 00692 mf_error( "Unexpected Byte" ); 00693 abort_parse=true; 00694 } |
|
Definition at line 660 of file jdkmidi_fileread.cpp. References abort_parse, input_stream, mf_error(), jdkmidi::MIDIFileReadStream::ReadChar(), and to_be_read.
00661 { 00662 int c; 00663 00664 c = input_stream->ReadChar(); 00665 00666 00667 if( c<0 ) 00668 { 00669 mf_error( "Unexpected Stream Error" ); 00670 abort_parse=true; 00671 return -1; 00672 } 00673 00674 --to_be_read; 00675 00676 return (int)c; 00677 } |
|
Definition at line 696 of file jdkmidi_fileread.cpp. References jdkmidi::MIDIFileEvents::ChanMessage(), cur_time, event_handler, jdkmidi::MIDIMessage::SetByte1(), jdkmidi::MIDIMessage::SetByte2(), jdkmidi::MIDIMessage::SetStatus(), and jdkmidi::MIDITimedMessage::SetTime().
00697 { 00698 MIDITimedMessage m; 00699 00700 m.SetStatus( st ); 00701 m.SetByte1( b1 ); 00702 m.SetByte2( b2 ); 00703 m.SetTime( cur_time ); 00704 00705 if( st>=0x80 && st<0xf0 ) 00706 { 00707 event_handler->ChanMessage(m); 00708 } 00709 00710 } |
|
Definition at line 174 of file fileread.h. References header_division.
00174 { return header_division; } |
|
Definition at line 172 of file fileread.h. References header_format.
00172 { return header_format; } |
|
Definition at line 173 of file fileread.h. References header_ntrks.
00173 { return header_ntrks; } |
|
Definition at line 344 of file jdkmidi_fileread.cpp. References abort_parse, event_handler, and jdkmidi::MIDIFileEvents::mf_error().
00345 { 00346 event_handler->mf_error(e); 00347 abort_parse=true; 00348 } |
|
Definition at line 679 of file jdkmidi_fileread.cpp. References max_msg_len, msg_index, and the_msg.
00680 { 00681 if( msg_index<max_msg_len ) 00682 the_msg[ msg_index++ ] = (unsigned char)a; 00683 } |
|
Definition at line 685 of file jdkmidi_fileread.cpp. References msg_index.
00686 { 00687 msg_index=0; 00688 } |
|
Definition at line 350 of file jdkmidi_fileread.cpp. References abort_parse, cur_track, mf_error(), ReadHeader(), and ReadTrack().
00351 { 00352 int n; 00353 00354 n = ReadHeader(); 00355 if( n <=0 ) 00356 { 00357 mf_error( "No Tracks" ); 00358 return false; 00359 } 00360 for( cur_track=0; cur_track<n; cur_track++ ) 00361 { 00362 ReadTrack(); 00363 if( abort_parse ) 00364 { 00365 return false; 00366 } 00367 } 00368 return true; 00369 } |
|
Definition at line 650 of file jdkmidi_fileread.cpp. References EGetC(), and jdkmidi::MIDIFile::To16Bit().
|
|
Definition at line 638 of file jdkmidi_fileread.cpp. References EGetC(), and jdkmidi::MIDIFile::To32Bit().
|
|
Definition at line 403 of file jdkmidi_fileread.cpp. References jdkmidi::_MThd, abort_parse, EGetC(), event_handler, header_division, header_format, header_ntrks, jdkmidi::MIDIFileEvents::mf_header(), Read16Bit(), Read32Bit(), ReadMT(), skip_init, and to_be_read.
00404 { 00405 int the_format; 00406 int ntrks; 00407 int division; 00408 00409 if( ReadMT( _MThd, skip_init )==0xffff ) 00410 return 0; 00411 00412 if( abort_parse ) 00413 return 0; 00414 00415 to_be_read = Read32Bit(); 00416 the_format=Read16Bit(); 00417 ntrks=Read16Bit(); 00418 division=Read16Bit(); 00419 00420 if( abort_parse ) 00421 return 0; 00422 00423 00424 header_format=the_format; 00425 header_ntrks=ntrks; 00426 header_division=division; 00427 00428 event_handler->mf_header( the_format, ntrks, division ); 00429 00430 00431 // printf( "\nto be read = %d\n", to_be_read ); 00432 00433 while( to_be_read > 0 ) 00434 EGetC(); 00435 00436 return ntrks; 00437 } |
|
Definition at line 371 of file jdkmidi_fileread.cpp. References abort_parse, EGetC(), mf_error(), and OSTYPE.
00372 { 00373 unsigned long read=0; 00374 int c; 00375 00376 read=OSTYPE( EGetC(), EGetC(), EGetC(), EGetC() ); 00377 if( type!=read ) 00378 { 00379 if( skip ) 00380 { 00381 do 00382 { 00383 read<<=8; 00384 c=EGetC(); 00385 read|=c; 00386 if( read==type ) 00387 return true; 00388 if( abort_parse ) 00389 return false; 00390 00391 } while( c!=-1 ); 00392 } 00393 mf_error( "Error looking for chunk type" ); 00394 return false; 00395 } 00396 else 00397 { 00398 return true; 00399 } 00400 00401 } |
|
Definition at line 443 of file jdkmidi_fileread.cpp. References jdkmidi::_MTrk, abort_parse, BadByte(), cur_time, cur_track, EGetC(), event_handler, FormChanMessage(), jdkmidi::MIDIFileEvents::MetaEvent(), jdkmidi::MIDIFileEvents::mf_arbitrary(), jdkmidi::MIDIFileEvents::mf_endtrack(), mf_error(), jdkmidi::MIDIFileEvents::mf_starttrack(), jdkmidi::MIDIFileEvents::mf_sysex(), msg_index, MsgAdd(), MsgInit(), no_merge, Read32Bit(), ReadMT(), ReadVariableNum(), the_msg, to_be_read, and jdkmidi::MIDIFileEvents::UpdateTime().
00444 { 00445 // 00446 // This array is indexed by the high half of a status byte. Its 00447 // value is either the number of bytes needed (1 or 2) for a channel 00448 // message, or 0 (meaning it's not a channel message). 00449 // 00450 00451 static char chantype[] = 00452 { 00453 0, 0, 0, 0, 0, 0, 0, 0, // 0x00 through 0x70 00454 2, 2, 2, 2, 1, 1, 2, 0 // 0x80 through 0xf0 00455 }; 00456 00457 unsigned long lookfor, lng; 00458 int c, c1, type; 00459 int sysexcontinue=0; // 1 if last message was unfinished sysex 00460 int running=0; // 1 when running status used 00461 int status=0; // (possible running) status byte 00462 int needed; 00463 00464 00465 if( ReadMT( _MTrk, 0) == 0xffff ) 00466 return; 00467 00468 to_be_read=Read32Bit(); 00469 cur_time=0; 00470 00471 event_handler->mf_starttrack( cur_track ); 00472 00473 while( to_be_read > 0 && !abort_parse ) 00474 { 00475 unsigned long deltat=ReadVariableNum(); 00476 00477 event_handler->UpdateTime( deltat ); 00478 00479 cur_time += deltat; 00480 00481 c=EGetC(); 00482 00483 if( c==-1 ) 00484 break; 00485 00486 if( sysexcontinue && c!=0xf7 ) 00487 mf_error( "Error after expected continuation of SysEx" ); 00488 00489 if( (c&0x80)==0 ) 00490 { 00491 if( status==0 ) 00492 mf_error( "Unexpected Running Status" ); 00493 running=1; 00494 needed = chantype[ (status>>4) & 0xf ]; 00495 } 00496 else 00497 { 00498 // TO DO: is running status to be cleared or not when meta event happens? 00499 00500 #if MIDIFRD_ALLOW_STATUS_ACROSS_META_EVENT 00501 if( c!=0xff ) 00502 { 00503 status=c; 00504 running=0; 00505 needed=0; 00506 } 00507 00508 #else 00509 status=c; 00510 running=0; 00511 needed = chantype[ (status>>4) & 0xf ]; 00512 #endif 00513 00514 } 00515 00516 00517 00518 if( needed ) // ie. is it a channel message? 00519 { 00520 if( running ) 00521 c1=c; 00522 else 00523 c1=EGetC(); 00524 FormChanMessage( (unsigned char)status, (unsigned char)c1, (unsigned char)((needed>1) ? EGetC() : 0 )); 00525 continue; 00526 } 00527 00528 00529 switch( c ) 00530 { 00531 case 0xff: // meta-event 00532 type=EGetC(); 00533 lng = ReadVariableNum(); 00534 00535 lookfor = to_be_read - lng; 00536 00537 MsgInit(); 00538 while( to_be_read > lookfor) 00539 { 00540 MsgAdd( EGetC() ); 00541 } 00542 00543 event_handler->MetaEvent( cur_time, type, msg_index, the_msg ); 00544 break; 00545 00546 case 0xf0: // start of sys-ex 00547 lng = ReadVariableNum(); 00548 lookfor = to_be_read - lng; 00549 00550 MsgInit(); 00551 MsgAdd(0xf0); 00552 00553 while( to_be_read>lookfor ) 00554 MsgAdd( c=EGetC() ); 00555 00556 if( c==0xf7 || no_merge==0 ) 00557 { 00558 // make a sysex object out of the raw sysex data 00559 // the buffer is not to be deleted upon destruction of ex 00560 00561 MIDISystemExclusive ex( 00562 the_msg, 00563 msg_index, 00564 msg_index, 00565 false 00566 ); 00567 00568 // give the sysex object to our event handler 00569 00570 event_handler->mf_sysex( cur_time, ex ); 00571 } 00572 else 00573 sysexcontinue=1; // merge into next msg 00574 break; 00575 case 0xf7: // sysex continuation or 00576 // arbitary stuff 00577 lng=ReadVariableNum(); 00578 lookfor = to_be_read - lng; 00579 00580 if( ! sysexcontinue ) 00581 MsgInit(); 00582 00583 while( to_be_read > lookfor ) 00584 MsgAdd(c=EGetC()); 00585 00586 if( !sysexcontinue ) 00587 { 00588 event_handler->mf_arbitrary( cur_time, msg_index, the_msg ); 00589 } 00590 else if( c== 0xf7 ) 00591 { 00592 // make a sysex object out of the raw sysex data 00593 // the buffer is not to be deleted upon destruction of ex 00594 00595 MIDISystemExclusive ex( 00596 the_msg, 00597 msg_index, 00598 msg_index, 00599 false 00600 ); 00601 event_handler->mf_sysex( cur_time, ex ); 00602 sysexcontinue=0; 00603 } 00604 break; 00605 default: 00606 BadByte(c); 00607 break; 00608 } 00609 } 00610 event_handler->mf_endtrack( cur_track ); 00611 return; 00612 } |
|
Definition at line 614 of file jdkmidi_fileread.cpp. References EGetC().
00615 { 00616 unsigned long value; 00617 int c; 00618 00619 c=EGetC(); 00620 if( c==-1 ) 00621 { 00622 return 0; 00623 } 00624 value = c; 00625 00626 if( c & 0x80 ) 00627 { 00628 value &= 0x7f; 00629 do 00630 { 00631 c=EGetC(); 00632 value = (value<<7) + (c&0x7f); 00633 } while( c&0x80 ); 00634 } 00635 return value; 00636 } |
|
Definition at line 188 of file fileread.h. |
|
Definition at line 184 of file fileread.h. |
|
Definition at line 187 of file fileread.h. |
|
Definition at line 217 of file fileread.h. |
|
Definition at line 214 of file fileread.h. |
|
Definition at line 212 of file fileread.h. |
|
Definition at line 213 of file fileread.h. |
|
Definition at line 216 of file fileread.h. |
|
Definition at line 191 of file fileread.h. |
|
Definition at line 192 of file fileread.h. |
|
Definition at line 183 of file fileread.h. |
|
Definition at line 185 of file fileread.h. |
|
Definition at line 190 of file fileread.h. |
|
Definition at line 186 of file fileread.h. |