jdkmidi class library documentation

Copyright © 2004 J.D. Koftinoff Software, Ltd.

Released under the GNU General Public License (GPL)




Main Page | Namespace List | Class Hierarchy | Alphabetical List | Class List | File List | Namespace Members | Class Members | File Members

jdkmidi::MIDIParser Class Reference

#include <parser.h>

List of all members.

Public Member Functions

 MIDIParser (ushort max_sysex_size=384)
virtual ~MIDIParser ()
void Clear ()
virtual bool Parse (uchar b, MIDIMessage *msg)
MIDISystemExclusiveGetSystemExclusive () const

Protected Types

enum  State {
  FIND_STATUS,
  FIRST_OF_ONE,
  FIRST_OF_TWO,
  SECOND_OF_TWO,
  FIRST_OF_ONE_NORUN,
  SYSEX_DATA
}

Protected Member Functions

bool ParseSystemByte (uchar b, MIDIMessage *msg)
bool ParseDataByte (uchar b, MIDIMessage *msg)
void ParseStatusByte (uchar b)

Protected Attributes

MIDIMessage tmp_msg
MIDISystemExclusivesysex
State state


Member Enumeration Documentation

enum jdkmidi::MIDIParser::State [protected]
 

Enumeration values:
FIND_STATUS 
FIRST_OF_ONE 
FIRST_OF_TWO 
SECOND_OF_TWO 
FIRST_OF_ONE_NORUN 
SYSEX_DATA 

Definition at line 65 of file parser.h.

00066         {
00067           FIND_STATUS,    // ignore data bytes
00068           FIRST_OF_ONE,   // read first data byte of a one data byte msg
00069           FIRST_OF_TWO,   // read first data byte of two data byte msg
00070           SECOND_OF_TWO,    // read second data byte of two data byte msg
00071           FIRST_OF_ONE_NORUN, // read one byte message, do not allow 
00072           // running status (for MTC)
00073           SYSEX_DATA    // read sysex data byte
00074         };


Constructor & Destructor Documentation

jdkmidi::MIDIParser::MIDIParser ushort  max_sysex_size = 384  ) 
 

Definition at line 54 of file jdkmidi_parser.cpp.

References ENTER, FIND_STATUS, state, sysex, and ushort.

00055   {
00056     ENTER( "MIDIParser::MIDIParser" );
00057     sysex = new MIDISystemExclusive(max_sysex_size);
00058     state=FIND_STATUS;
00059   }

jdkmidi::MIDIParser::~MIDIParser  )  [virtual]
 

Definition at line 61 of file jdkmidi_parser.cpp.

References ENTER, and sysex.

00062   {
00063     ENTER( "MIDIParser::~MIDIParser" );
00064     
00065     delete sysex;
00066   }


Member Function Documentation

void jdkmidi::MIDIParser::Clear  )  [inline]
 

Definition at line 50 of file parser.h.

References FIND_STATUS, and state.

00051         {
00052           state=FIND_STATUS;
00053         }

MIDISystemExclusive* jdkmidi::MIDIParser::GetSystemExclusive  )  const [inline]
 

Definition at line 57 of file parser.h.

References sysex.

00057 { return sysex; }

bool jdkmidi::MIDIParser::Parse uchar  b,
MIDIMessage msg
[virtual]
 

Definition at line 69 of file jdkmidi_parser.cpp.

References ENTER, ParseDataByte(), ParseStatusByte(), ParseSystemByte(), and uchar.

00070   {
00071     ENTER( "MIDIParser::Parse()" );
00072     
00073     //
00074     // No matter what state we are currently in we must deal
00075     // with bytes with the high bit set first.
00076     //
00077     
00078     if( b&0x80 )
00079     {
00080       //
00081       // check for system messages (>=0xf0)
00082       //
00083       
00084       uchar stat=(uchar)(b&0xf0);
00085       
00086       if( stat==0xf0 )
00087       {
00088         //
00089         // System messages get parsed by
00090         // ParseSystemByte()
00091         //
00092         
00093         return ParseSystemByte( b, msg );
00094       }
00095       else
00096       {
00097         //
00098         // Otherwise, this is a new status byte.
00099         //
00100         
00101         ParseStatusByte( b );
00102         return false;
00103       }
00104     }
00105     else
00106     {
00107       //
00108       // Try to parse the data byte
00109       //
00110       
00111       return ParseDataByte( b, msg );
00112     }
00113   }

bool jdkmidi::MIDIParser::ParseDataByte uchar  b,
MIDIMessage msg
[protected]
 

Definition at line 303 of file jdkmidi_parser.cpp.

References ENTER, FIND_STATUS, FIRST_OF_ONE, FIRST_OF_ONE_NORUN, FIRST_OF_TWO, jdkmidi::MIDISystemExclusive::PutByte(), SECOND_OF_TWO, jdkmidi::MIDIMessage::SetByte1(), jdkmidi::MIDIMessage::SetByte2(), state, sysex, SYSEX_DATA, tmp_msg, and uchar.

00304   {
00305     ENTER( "MIDIParser::ParseDataByte" );
00306     
00307     switch( state )
00308     {
00309     case FIND_STATUS:
00310     {
00311       //
00312       // just eat data bytes until we get a status byte
00313       //
00314       
00315       return false;
00316     }
00317     
00318     case FIRST_OF_ONE:
00319     {
00320       //
00321       // this is the only data byte of a message.
00322       // form the message and return it.
00323       //
00324       
00325       tmp_msg.SetByte1( b );
00326       *msg = tmp_msg;
00327       
00328       //
00329       // stay in this state for running status 
00330       //
00331       
00332       return true;
00333     }
00334     
00335     case FIRST_OF_TWO:
00336     {
00337       //
00338       // this is the first byte of a two byte message.
00339       // read it in. go to SECOND_OF_TWO state. do not 
00340       // return anything.
00341       //
00342       
00343       tmp_msg.SetByte1( b );
00344       state=SECOND_OF_TWO;
00345       return false;
00346     }
00347     
00348     case SECOND_OF_TWO:
00349     {
00350       //
00351       // this is the second byte of a two byte message.
00352       // read it in. form the message, and return in.
00353       // go back to FIRST_OF_TWO state to allow
00354       // running status.
00355       //
00356       
00357       tmp_msg.SetByte2( b );
00358       state=FIRST_OF_TWO;
00359       *msg=tmp_msg;
00360       
00361       return true;
00362     }
00363     
00364     case FIRST_OF_ONE_NORUN:
00365     {
00366       //
00367       // Single data byte system message, like MTC.
00368       // form the message, return it, and go to FIND_STATUS
00369       // state. Do not allow running status.
00370       //
00371       
00372       tmp_msg.SetByte1( b );
00373       state=FIND_STATUS;
00374       *msg=tmp_msg;
00375       
00376       return true;
00377     }
00378     
00379     case SYSEX_DATA:
00380     {
00381       //
00382       // store the byte into the sysex buffer. Stay
00383       // in this state. Only a status byte can
00384       // change our state.
00385       //
00386       
00387       sysex->PutByte( b );
00388       return false;
00389     }
00390     
00391     default:
00392     {
00393       //
00394       // UNKNOWN STATE! go into FIND_STATUS state
00395       //
00396       
00397       state=FIND_STATUS;
00398       return false;
00399     }
00400     
00401     }
00402   }

void jdkmidi::MIDIParser::ParseStatusByte uchar  b  )  [protected]
 

Definition at line 279 of file jdkmidi_parser.cpp.

References ENTER, FIND_STATUS, FIRST_OF_ONE, FIRST_OF_TWO, jdkmidi::GetMessageLength(), jdkmidi::MIDIMessage::SetStatus(), state, tmp_msg, and uchar.

00280   {
00281     ENTER( "MIDIParser::ParseStatusByte" );
00282     
00283     char len=GetMessageLength( b );
00284     
00285     if( len==2 )
00286     {
00287       state=FIRST_OF_ONE;
00288       tmp_msg.SetStatus( b );
00289     }
00290     else if( len==3 )
00291     {
00292       state=FIRST_OF_TWO;
00293       tmp_msg.SetStatus( b );
00294     }
00295     else
00296     {
00297       state=FIND_STATUS;
00298       tmp_msg.SetStatus( 0 );
00299     }
00300   }

bool jdkmidi::MIDIParser::ParseSystemByte uchar  b,
MIDIMessage msg
[protected]
 

Definition at line 118 of file jdkmidi_parser.cpp.

References jdkmidi::ACTIVE_SENSE, jdkmidi::MIDISystemExclusive::Clear(), jdkmidi::CONTINUE, ENTER, FIND_STATUS, FIRST_OF_ONE, FIRST_OF_ONE_NORUN, FIRST_OF_TWO, jdkmidi::MEASURE_END, jdkmidi::MTC, jdkmidi::MIDISystemExclusive::PutEOX(), jdkmidi::MIDISystemExclusive::PutEXC(), jdkmidi::RESET, jdkmidi::MIDIMessage::SetStatus(), jdkmidi::SONG_POSITION, jdkmidi::SONG_SELECT, jdkmidi::START, state, jdkmidi::STOP, sysex, SYSEX_DATA, jdkmidi::SYSEX_END, jdkmidi::SYSEX_START, jdkmidi::TIMING_CLOCK, tmp_msg, jdkmidi::TUNE_REQUEST, and uchar.

00119   {
00120     ENTER( "MIDIParser::ParseSystemByte" );
00121     
00122     switch( b )
00123     {
00124     case RESET:
00125     {
00126       //
00127       // a reset byte always re-initializes our state 
00128       // machine.
00129       //
00130       
00131       state=FIND_STATUS;
00132       
00133       
00134       return false;
00135     }
00136     
00137     case SYSEX_START:
00138     {
00139       //
00140       // start receiving sys-ex data
00141       //
00142       
00143       state=SYSEX_DATA;
00144       
00145       //
00146       // Prepare sysex buffer.
00147       //
00148       
00149       sysex->Clear();
00150       sysex->PutEXC();
00151       
00152       return false;
00153     }
00154     
00155     case SYSEX_END:
00156     {
00157       //
00158       // We are finished receiving a sysex message.
00159       //
00160       
00161       
00162       //
00163       // If we were not in SYSEX_DATA mode, this
00164       // EOX means nothing.
00165       //
00166       
00167       if( state!=SYSEX_DATA )
00168       {
00169         
00170         return false;
00171       }
00172       
00173       //
00174       // reset the state machine
00175       //
00176       
00177       state=FIND_STATUS;
00178       
00179       
00180       //
00181       // finish up sysex buffer
00182       //
00183       
00184       sysex->PutEOX();
00185       
00186       //
00187       // return a MIDIMessage with status=SYSEX_START
00188       // so calling program can know to look at
00189       // the sysex buffer with GetSystemExclusive().
00190       //
00191       
00192       msg->SetStatus( SYSEX_START );
00193       
00194       
00195       return true;
00196     }
00197     
00198     case MTC:
00199     {
00200       //
00201       // Go into FIRST_OF_ONE_NORUN state.
00202       // this is required because MTC (F1) is not
00203       // allowed to be running status.
00204       //
00205       
00206       tmp_msg.SetStatus( MTC );
00207       
00208       state=FIRST_OF_ONE_NORUN;
00209       
00210       return false;
00211     }
00212     
00213     case SONG_POSITION:
00214     {
00215       //
00216       // This is a two data byte message, so go into
00217       // FIRST_OF_TWO state. 
00218       //
00219       
00220       state=FIRST_OF_TWO;
00221       
00222       tmp_msg.SetStatus( SONG_POSITION );
00223       
00224       return false;
00225     }
00226     
00227     case SONG_SELECT:
00228     {
00229       //
00230       // This is a one data byte message, so go into
00231       // the FIRST_OF_ONE state.
00232       //
00233       
00234       state=FIRST_OF_ONE;
00235       tmp_msg.SetStatus( SONG_SELECT );
00236       
00237       return false;
00238     }
00239     
00240     
00241     //
00242     // the one byte system messages.
00243     // these messages may interrupt any other message,
00244     // and therefore do not affect the current state or
00245     // running status.
00246     //
00247     
00248     case TUNE_REQUEST:
00249     case TIMING_CLOCK:
00250     case MEASURE_END:
00251     case START:
00252     case CONTINUE:
00253     case STOP:
00254     case ACTIVE_SENSE:
00255     {
00256       msg->SetStatus( b );
00257       return true;
00258     }
00259     
00260     default:
00261     {
00262       //
00263       // any other byte must be ignored.
00264       // It is either a communicatin error or
00265       // a new type of MIDI message.
00266       // go into FIND_STATUS state to ignore
00267       // any possible data bytes for this unknown message
00268       //
00269       
00270       state=FIND_STATUS;
00271       return false;
00272     }
00273     }
00274     
00275     
00276   }


Member Data Documentation

State jdkmidi::MIDIParser::state [protected]
 

Definition at line 78 of file parser.h.

MIDISystemExclusive* jdkmidi::MIDIParser::sysex [protected]
 

Definition at line 77 of file parser.h.

MIDIMessage jdkmidi::MIDIParser::tmp_msg [protected]
 

Definition at line 76 of file parser.h.


The documentation for this class was generated from the following files: