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::MIDIFileWrite Class Reference

#include <filewrite.h>

Inheritance diagram for jdkmidi::MIDIFileWrite:

jdkmidi::MIDIFile List of all members.

Public Member Functions

 MIDIFileWrite (MIDIFileWriteStream *out_stream_)
virtual ~MIDIFileWrite ()
bool ErrorOccurred ()
unsigned long GetFileLength ()
unsigned long GetTrackLength ()
void ResetTrackLength ()
void ResetTrackTime ()
void WriteFileHeader (int format, int ntrks, int division)
void WriteTrackHeader (unsigned long length)
void WriteEvent (const MIDITimedMessage &m)
void WriteEvent (unsigned long time, const MIDISystemExclusive *e)
void WriteEvent (unsigned long time, unsigned short text_type, const char *text)
void WriteEvent (const MIDITimedBigMessage &m)
void WriteMetaEvent (unsigned long time, unsigned char type, const unsigned char *data, long length)
void WriteTempo (unsigned long time, long tempo)
void WriteKeySignature (unsigned long time, char sharp_flat, char minor)
void WriteTimeSignature (unsigned long time, char numerator=4, char denominator_power=2, char midi_clocks_per_metronome=24, char num_32nd_per_midi_quarter_note=8)
void WriteEndOfTrack (unsigned long time)
virtual void RewriteTrackLength ()

Protected Member Functions

virtual void Error (char *s)
void WriteCharacter (uchar c)
void Seek (long pos)
void IncrementCounters (int c)
void WriteShort (unsigned short c)
void Write3Char (long c)
void WriteLong (unsigned long c)
int WriteVariableNum (unsigned long n)
void WriteDeltaTime (unsigned long time)

Private Attributes

bool error
bool within_track
unsigned long file_length
unsigned long track_length
unsigned long track_time
unsigned long track_position
uchar running_status
MIDIFileWriteStreamout_stream

Constructor & Destructor Documentation

jdkmidi::MIDIFileWrite::MIDIFileWrite MIDIFileWriteStream out_stream_  ) 
 

Definition at line 87 of file jdkmidi_filewrite.cpp.

References ENTER, error, file_length, running_status, track_length, track_position, and track_time.

00088     : out_stream( out_stream_ ) 
00089   {
00090     ENTER( "MIDIFileWrite::MIDIFileWrite()" );
00091     
00092     file_length=0;
00093     error=0;
00094     track_length=0;
00095     track_time=0;
00096     running_status=0;
00097     track_position=0;
00098   } 

jdkmidi::MIDIFileWrite::~MIDIFileWrite  )  [virtual]
 

Definition at line 100 of file jdkmidi_filewrite.cpp.

References ENTER.

00101   {
00102     ENTER( "MIDIFileWrite::~MIDIFileWrite()" );
00103     
00104   } 


Member Function Documentation

void jdkmidi::MIDIFileWrite::Error char *  s  )  [protected, virtual]
 

Definition at line 106 of file jdkmidi_filewrite.cpp.

References ENTER, and error.

00107   {
00108     ENTER( "void  MIDIFileWrite::Error()" );
00109     
00110     // NULL method; can override.
00111     
00112     error=true;
00113   } 

bool jdkmidi::MIDIFileWrite::ErrorOccurred  )  [inline]
 

Definition at line 97 of file filewrite.h.

References error.

00097 { return error;         }

unsigned long jdkmidi::MIDIFileWrite::GetFileLength  )  [inline]
 

Definition at line 98 of file filewrite.h.

References file_length.

00098 { return file_length;   }

unsigned long jdkmidi::MIDIFileWrite::GetTrackLength  )  [inline]
 

Definition at line 99 of file filewrite.h.

References track_length.

00099 { return track_length;  }

void jdkmidi::MIDIFileWrite::IncrementCounters int  c  )  [inline, protected]
 

Definition at line 146 of file filewrite.h.

References file_length, and track_length.

00146 { track_length+=c; file_length+=c; }

void jdkmidi::MIDIFileWrite::ResetTrackLength  )  [inline]
 

Definition at line 100 of file filewrite.h.

References track_length.

00100 { track_length=0;       }

void jdkmidi::MIDIFileWrite::ResetTrackTime  )  [inline]
 

Definition at line 101 of file filewrite.h.

References track_time.

00101 { track_time=0;         }

void jdkmidi::MIDIFileWrite::RewriteTrackLength  )  [virtual]
 

Definition at line 485 of file jdkmidi_filewrite.cpp.

References ENTER, Seek(), track_length, track_position, and WriteLong().

00486   {
00487     ENTER( "void  MIDIFileWrite::RewriteTrackLength()" );
00488     
00489     // go back and patch in the tracks length into the track chunk
00490     // header, now that we know the proper value.
00491     // then make sure we go back to the end of the file
00492     
00493     Seek( track_position+4 );
00494     WriteLong( track_length );
00495     Seek( track_position+8+track_length );
00496   } 

void jdkmidi::MIDIFileWrite::Seek long  pos  )  [inline, protected]
 

Definition at line 140 of file filewrite.h.

References error, out_stream, and jdkmidi::MIDIFileWriteStream::Seek().

00141         {
00142           if( out_stream->Seek( pos )<0 )
00143             error=true;
00144         }

void jdkmidi::MIDIFileWrite::Write3Char long  c  )  [protected]
 

Definition at line 123 of file jdkmidi_filewrite.cpp.

References ENTER, and WriteCharacter().

00124   {
00125     ENTER( "void  MIDIFileWrite::Write3Char()" );
00126     
00127     WriteCharacter( (unsigned char)((c>>16)&0xff) );
00128     WriteCharacter( (unsigned char)((c>>8)&0xff) );
00129     WriteCharacter( (unsigned char)((c&0xff)) );
00130   } 

void jdkmidi::MIDIFileWrite::WriteCharacter uchar  c  )  [inline, protected]
 

Definition at line 134 of file filewrite.h.

References error, out_stream, uchar, and jdkmidi::MIDIFileWriteStream::WriteChar().

00135         {
00136           if( out_stream->WriteChar( c )<0 )
00137             error=true;
00138         }

void jdkmidi::MIDIFileWrite::WriteDeltaTime unsigned long  time  )  [protected]
 

Definition at line 207 of file jdkmidi_filewrite.cpp.

References ENTER, IncrementCounters(), track_time, and WriteVariableNum().

00208   {
00209     ENTER( "void  MIDIFileWrite::WriteDeltaTime()" );
00210     
00211     long dtime=abs_time-track_time;
00212     if( dtime<0 )
00213     {
00214 //    Error( "Events out of order" );
00215       dtime=0;
00216     }
00217     
00218     IncrementCounters( WriteVariableNum( dtime ) );
00219     track_time=abs_time;
00220   } 

void jdkmidi::MIDIFileWrite::WriteEndOfTrack unsigned long  time  ) 
 

Definition at line 467 of file jdkmidi_filewrite.cpp.

References ENTER, IncrementCounters(), running_status, track_time, within_track, WriteCharacter(), and WriteDeltaTime().

00468   {
00469     ENTER( "void  MIDIFileWrite::WriteEndOfTrack()" );
00470     
00471     if( within_track==true )
00472     {
00473       if( time==0 )
00474         time=track_time;
00475       WriteDeltaTime( time );
00476       WriteCharacter( (unsigned char) 0xff );   // Meta-Event
00477       WriteCharacter( (unsigned char) 0x2f );   // End of track
00478       WriteCharacter( (unsigned char) 0x00 );   // length of event
00479       IncrementCounters( 3 );
00480       within_track=false;
00481       running_status=0;
00482     }
00483   } 

void jdkmidi::MIDIFileWrite::WriteEvent const MIDITimedBigMessage m  ) 
 

Definition at line 279 of file jdkmidi_filewrite.cpp.

References jdkmidi::MIDISystemExclusive::GetBuf(), jdkmidi::MIDIMessage::GetByte1(), jdkmidi::MIDIMessage::GetByte2(), jdkmidi::MIDIMessage::GetKeySigMajorMinor(), jdkmidi::MIDIMessage::GetKeySigSharpFlats(), jdkmidi::MIDIMessage::GetLength(), jdkmidi::MIDISystemExclusive::GetLength(), jdkmidi::MIDIMessage::GetMetaType(), jdkmidi::MIDIMessage::GetStatus(), jdkmidi::MIDIBigMessage::GetSysEx(), jdkmidi::MIDIMessage::GetTempo32(), jdkmidi::MIDITimedBigMessage::GetTime(), IncrementCounters(), jdkmidi::MIDIMessage::IsDataEnd(), jdkmidi::MIDIMessage::IsKeySig(), jdkmidi::MIDIMessage::IsMetaEvent(), jdkmidi::MIDIMessage::IsNoOp(), jdkmidi::MIDIMessage::IsSysEx(), jdkmidi::MIDIMessage::IsTempo(), running_status, WriteCharacter(), WriteDeltaTime(), WriteEndOfTrack(), WriteEvent(), WriteKeySignature(), WriteMetaEvent(), and WriteTempo().

00280   {
00281     if( m.IsNoOp() )
00282     {
00283       return;
00284     }
00285     
00286     if( m.IsMetaEvent() )
00287     {
00288       // if this meta-event has a sysex buffer attached, this
00289       // buffer contains the raw midi file meta data
00290       
00291       if( m.GetSysEx() )
00292       {
00293         WriteMetaEvent(
00294           m.GetTime(),
00295           m.GetMetaType(),
00296           m.GetSysEx()->GetBuf(),
00297           m.GetSysEx()->GetLength()
00298           );
00299       }
00300       else
00301       {
00302         // otherwise, it is a type of sysex that doesnt have
00303         // data...
00304         if( m.IsTempo() )
00305         {
00306           unsigned long tempo = (60000000/m.GetTempo32())*32;
00307           WriteTempo( m.GetTime(), tempo );
00308         }
00309         else if( m.IsDataEnd() )
00310         {
00311           WriteEndOfTrack( m.GetTime() );
00312         }
00313         else if( m.IsKeySig() )
00314         {
00315           WriteKeySignature( m.GetTime(), m.GetKeySigSharpFlats(), m.GetKeySigMajorMinor() );
00316         }
00317         
00318       }
00319       
00320     }
00321     else
00322     {
00323       short len=m.GetLength();
00324       
00325       if( m.IsSysEx() && m.GetSysEx() )
00326       {
00327         WriteEvent( m.GetTime(), m.GetSysEx() );
00328       }
00329       else if( len>0 )
00330       {
00331         WriteDeltaTime( m.GetTime() );
00332         if( m.GetStatus()!=running_status )
00333         {
00334           running_status=m.GetStatus();
00335           WriteCharacter( (unsigned char) running_status );
00336           IncrementCounters(1);
00337         }
00338         if( len>1 )
00339         {
00340           WriteCharacter( (unsigned char) m.GetByte1() );
00341           IncrementCounters(1);
00342         }
00343         if( len>2 )
00344         {
00345           WriteCharacter( (unsigned char) m.GetByte2() );
00346           IncrementCounters(1);
00347         }
00348       }
00349     }
00350     
00351   }

void jdkmidi::MIDIFileWrite::WriteEvent unsigned long  time,
unsigned short  text_type,
const char *  text
 

Definition at line 375 of file jdkmidi_filewrite.cpp.

References ENTER, IncrementCounters(), running_status, WriteCharacter(), WriteDeltaTime(), and WriteVariableNum().

00376   {
00377     ENTER( "void  MIDIFileWrite::WriteEvent()" );
00378     
00379     WriteDeltaTime( time );
00380     
00381     WriteCharacter( (unsigned char) 0xff );   // META-Event
00382     WriteCharacter( (unsigned char) text_type );  // Text event type
00383     
00384     IncrementCounters(2);
00385     
00386     long len=strlen(text);
00387     
00388     IncrementCounters( WriteVariableNum( len ) );
00389     
00390     while( *text )
00391     {
00392       WriteCharacter( (unsigned char) *text++ );
00393     }
00394     IncrementCounters( len );
00395     running_status=0;
00396   } 

void jdkmidi::MIDIFileWrite::WriteEvent unsigned long  time,
const MIDISystemExclusive e
 

Definition at line 353 of file jdkmidi_filewrite.cpp.

References ENTER, jdkmidi::MIDISystemExclusive::GetData(), jdkmidi::MIDISystemExclusive::GetLength(), IncrementCounters(), running_status, jdkmidi::SYSEX_START, WriteCharacter(), WriteDeltaTime(), and WriteVariableNum().

00357   {
00358     ENTER( "void  MIDIFileWrite::WriteEvent()" );
00359     
00360     int len=e->GetLength();
00361     
00362     WriteDeltaTime( time );
00363     
00364     WriteCharacter( (unsigned char)SYSEX_START );
00365     IncrementCounters( WriteVariableNum( len-1 ) );
00366     
00367     for( int i=1; i<len; i++ )  // skip the initial 0xF0
00368     {
00369       WriteCharacter( (unsigned char)(e->GetData(i)) );
00370     }
00371     IncrementCounters( len );
00372     running_status=0;
00373   } 

void jdkmidi::MIDIFileWrite::WriteEvent const MIDITimedMessage m  ) 
 

Definition at line 222 of file jdkmidi_filewrite.cpp.

References ENTER, jdkmidi::MIDIMessage::GetByte1(), jdkmidi::MIDIMessage::GetByte2(), jdkmidi::MIDIMessage::GetKeySigMajorMinor(), jdkmidi::MIDIMessage::GetKeySigSharpFlats(), jdkmidi::MIDIMessage::GetLength(), jdkmidi::MIDIMessage::GetStatus(), jdkmidi::MIDIMessage::GetTempo32(), jdkmidi::MIDITimedMessage::GetTime(), IncrementCounters(), jdkmidi::MIDIMessage::IsDataEnd(), jdkmidi::MIDIMessage::IsKeySig(), jdkmidi::MIDIMessage::IsMetaEvent(), jdkmidi::MIDIMessage::IsNoOp(), jdkmidi::MIDIMessage::IsTempo(), running_status, WriteCharacter(), WriteDeltaTime(), WriteEndOfTrack(), WriteKeySignature(), and WriteTempo().

00223   {
00224     ENTER( "void    MIDIFileWrite::WriteEvent()" );
00225     
00226     if( m.IsNoOp() )
00227     {
00228       return;
00229     }
00230     
00231     if( m.IsMetaEvent() )
00232     {
00233       // TO DO: add more meta events.
00234       
00235       
00236       if( m.IsTempo() )
00237       {
00238         unsigned long tempo = (60000000/m.GetTempo32())*32;
00239         WriteTempo( m.GetTime(), tempo );
00240         return;
00241       }
00242       if( m.IsDataEnd() )
00243       {
00244         WriteEndOfTrack( m.GetTime() );
00245         return;
00246       }
00247       if( m.IsKeySig() )
00248       {
00249         WriteKeySignature( m.GetTime(), m.GetKeySigSharpFlats(), m.GetKeySigMajorMinor() );
00250         return;
00251       }
00252       return; // all other marks are ignored.
00253     }
00254     else
00255     {
00256       short len=m.GetLength();
00257       
00258       WriteDeltaTime( m.GetTime() );
00259       if( m.GetStatus()!=running_status )
00260       {
00261         running_status=m.GetStatus();
00262         WriteCharacter( (unsigned char) running_status );
00263         IncrementCounters(1);
00264       }
00265       if( len>1 )
00266       {
00267         WriteCharacter( (unsigned char) m.GetByte1() );
00268         IncrementCounters(1);
00269       }
00270       if( len>2 )
00271       {
00272         WriteCharacter( (unsigned char) m.GetByte2() );
00273         IncrementCounters(1);
00274       }
00275     }
00276     
00277   } 

void jdkmidi::MIDIFileWrite::WriteFileHeader int  format,
int  ntrks,
int  division
 

Definition at line 142 of file jdkmidi_filewrite.cpp.

References ENTER, file_length, WriteCharacter(), WriteLong(), and WriteShort().

00147   {
00148     ENTER( "void  MIDIFileWrite::WriteFileHeader()" );
00149     
00150     WriteCharacter( (unsigned char) 'M' );
00151     WriteCharacter( (unsigned char) 'T' );
00152     WriteCharacter( (unsigned char) 'h' );
00153     WriteCharacter( (unsigned char) 'd' );
00154     WriteLong( 6 );
00155     WriteShort( (short)format );
00156     WriteShort( (short)ntrks );
00157     WriteShort( (short)division );
00158     file_length=4+4+6;
00159   } 

void jdkmidi::MIDIFileWrite::WriteKeySignature unsigned long  time,
char  sharp_flat,
char  minor
 

Definition at line 432 of file jdkmidi_filewrite.cpp.

References ENTER, IncrementCounters(), running_status, WriteCharacter(), and WriteDeltaTime().

00433   {
00434     ENTER( "void  MIDIFileWrite::WriteKeySignature()" );
00435     
00436     WriteDeltaTime( time );
00437     WriteCharacter( (unsigned char) 0xff );   // Meta-Event
00438     WriteCharacter( (unsigned char) 0x59 );   // Key Sig
00439     WriteCharacter( (unsigned char) 0x02 );   // length of event
00440     WriteCharacter( (unsigned char) sharp_flat ); // - for flats, + for sharps
00441     WriteCharacter( (unsigned char) minor );  // 1 if minor key
00442     IncrementCounters(5);
00443     running_status=0;
00444   } 

void jdkmidi::MIDIFileWrite::WriteLong unsigned long  c  )  [protected]
 

Definition at line 132 of file jdkmidi_filewrite.cpp.

References ENTER, and WriteCharacter().

00133   {
00134     ENTER( "void  MIDIFileWrite::WriteLong()" );
00135     
00136     WriteCharacter( (unsigned char) ((c>>24)&0xff) );
00137     WriteCharacter( (unsigned char) ((c>>16)&0xff) );
00138     WriteCharacter( (unsigned char) ((c>>8)&0xff) );
00139     WriteCharacter( (unsigned char) ((c&0xff)) );
00140   } 

void jdkmidi::MIDIFileWrite::WriteMetaEvent unsigned long  time,
unsigned char  type,
const unsigned char *  data,
long  length
 

Definition at line 398 of file jdkmidi_filewrite.cpp.

References ENTER, IncrementCounters(), running_status, WriteCharacter(), WriteDeltaTime(), and WriteVariableNum().

00399   {
00400     ENTER( "void  MIDIFileWrite::WriteMetaEvent()" );
00401     
00402     WriteDeltaTime( time );
00403     WriteCharacter( (unsigned char) 0xff ); // META-Event
00404     WriteCharacter( (unsigned char) type ); // Meta-event type
00405     
00406     IncrementCounters(2);
00407     
00408     IncrementCounters( WriteVariableNum( length ) );
00409     
00410     for( int i=0; i<length; i++ )
00411     {
00412       WriteCharacter( (unsigned char) data[i] );
00413     }
00414     IncrementCounters( length );
00415     running_status=0;
00416   } 

void jdkmidi::MIDIFileWrite::WriteShort unsigned short  c  )  [protected]
 

Definition at line 115 of file jdkmidi_filewrite.cpp.

References ENTER, and WriteCharacter().

00116   {
00117     ENTER( "void    MIDIFileWrite::WriteShort()" );
00118     
00119     WriteCharacter( (unsigned char)((c>>8)&0xff) );
00120     WriteCharacter( (unsigned char)((c&0xff)) );
00121   } 

void jdkmidi::MIDIFileWrite::WriteTempo unsigned long  time,
long  tempo
 

Definition at line 418 of file jdkmidi_filewrite.cpp.

References ENTER, IncrementCounters(), running_status, Write3Char(), WriteCharacter(), and WriteDeltaTime().

00419   {
00420     ENTER( "void  MIDIFileWrite::WriteTempo()" );
00421     
00422     WriteDeltaTime( time );
00423     WriteCharacter( (unsigned char) 0xff ); // Meta-Event
00424     WriteCharacter( (unsigned char) 0x51 ); // Tempo event
00425     WriteCharacter( (unsigned char) 0x03 ); // length of event
00426     
00427     Write3Char( tempo );
00428     IncrementCounters(6);
00429     running_status=0;
00430   } 

void jdkmidi::MIDIFileWrite::WriteTimeSignature unsigned long  time,
char  numerator = 4,
char  denominator_power = 2,
char  midi_clocks_per_metronome = 24,
char  num_32nd_per_midi_quarter_note = 8
 

Definition at line 446 of file jdkmidi_filewrite.cpp.

References ENTER, IncrementCounters(), running_status, WriteCharacter(), and WriteDeltaTime().

00452   {
00453     ENTER( "void  MIDIFileWrite::WriteTimeSignature()" );
00454     
00455     WriteDeltaTime( time );
00456     WriteCharacter( (unsigned char) 0xff );   // Meta-Event
00457     WriteCharacter( (unsigned char) 0x58 );   // time signature
00458     WriteCharacter( (unsigned char) 0x04 );   // length of event
00459     WriteCharacter( (unsigned char) numerator );
00460     WriteCharacter( (unsigned char) denominator_power );
00461     WriteCharacter( (unsigned char) midi_clocks_per_metronome );
00462     WriteCharacter( (unsigned char) num_32nd_per_midi_quarter_note );
00463     IncrementCounters(7);
00464     running_status=0;
00465   } 

void jdkmidi::MIDIFileWrite::WriteTrackHeader unsigned long  length  ) 
 

Definition at line 161 of file jdkmidi_filewrite.cpp.

References ENTER, file_length, running_status, track_length, track_position, track_time, within_track, WriteCharacter(), and WriteLong().

00162   {
00163     ENTER( "void  MIDIFileWrite::WriteTrackHeader()" );
00164     
00165     track_position=file_length;
00166     track_length=0;
00167     track_time=0;
00168     running_status=0;
00169     
00170     WriteCharacter( (unsigned char) 'M' );
00171     WriteCharacter( (unsigned char) 'T' );
00172     WriteCharacter( (unsigned char) 'r' );
00173     WriteCharacter( (unsigned char) 'k' );
00174     
00175     WriteLong( length );
00176     file_length+=8;
00177     within_track=true;
00178   } 

int jdkmidi::MIDIFileWrite::WriteVariableNum unsigned long  n  )  [protected]
 

Definition at line 180 of file jdkmidi_filewrite.cpp.

References ENTER, and WriteCharacter().

00181   {
00182     ENTER( "short MIDIFileWrite::WriteVariableNum()" );
00183     
00184     register unsigned long buffer;
00185     short cnt=0;
00186     
00187     buffer=n&0x7f;
00188     while( (n>>=7) > 0)
00189     {
00190       buffer <<=8;
00191       buffer|=0x80;
00192       buffer+=(n&0x7f);
00193     }
00194     
00195     while( true )
00196     {
00197       WriteCharacter( (unsigned char) (buffer&0xff) );
00198       cnt++;
00199       if( buffer&0x80 )
00200         buffer>>=8;
00201       else
00202         break;
00203     }
00204     return cnt;
00205   } 


Member Data Documentation

bool jdkmidi::MIDIFileWrite::error [private]
 

Definition at line 157 of file filewrite.h.

unsigned long jdkmidi::MIDIFileWrite::file_length [private]
 

Definition at line 159 of file filewrite.h.

MIDIFileWriteStream* jdkmidi::MIDIFileWrite::out_stream [private]
 

Definition at line 165 of file filewrite.h.

uchar jdkmidi::MIDIFileWrite::running_status [private]
 

Definition at line 163 of file filewrite.h.

unsigned long jdkmidi::MIDIFileWrite::track_length [private]
 

Definition at line 160 of file filewrite.h.

unsigned long jdkmidi::MIDIFileWrite::track_position [private]
 

Definition at line 162 of file filewrite.h.

unsigned long jdkmidi::MIDIFileWrite::track_time [private]
 

Definition at line 161 of file filewrite.h.

bool jdkmidi::MIDIFileWrite::within_track [private]
 

Definition at line 158 of file filewrite.h.


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