#include <filewrite.h>
Inheritance diagram for jdkmidi::MIDIFileWrite:

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 |
| 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 } |
|
|
Definition at line 100 of file jdkmidi_filewrite.cpp. References ENTER.
00101 {
00102 ENTER( "MIDIFileWrite::~MIDIFileWrite()" );
00103
00104 }
|
|
|
Definition at line 106 of file jdkmidi_filewrite.cpp.
|
|
|
Definition at line 97 of file filewrite.h. References error.
00097 { return error; }
|
|
|
Definition at line 98 of file filewrite.h. References file_length.
00098 { return file_length; }
|
|
|
Definition at line 99 of file filewrite.h. References track_length.
00099 { return track_length; }
|
|
|
Definition at line 146 of file filewrite.h. References file_length, and track_length.
00146 { track_length+=c; file_length+=c; }
|
|
|
Definition at line 100 of file filewrite.h. References track_length.
00100 { track_length=0; }
|
|
|
Definition at line 101 of file filewrite.h. References track_time.
00101 { track_time=0; }
|
|
|
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 }
|
|
|
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 }
|
|
|
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 }
|
|
|
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 }
|
|
|
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 }
|
|
|
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 }
|
|
|
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 }
|
|
||||||||||||||||
|
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 }
|
|
||||||||||||
|
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 }
|
|
|
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 }
|
|
||||||||||||||||
|
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 }
|
|
||||||||||||||||
|
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 }
|
|
|
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 }
|
|
||||||||||||||||||||
|
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 }
|
|
|
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 }
|
|
||||||||||||
|
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 }
|
|
||||||||||||||||||||||||
|
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 }
|
|
|
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 }
|
|
|
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 }
|
|
|
Definition at line 157 of file filewrite.h. |
|
|
Definition at line 159 of file filewrite.h. |
|
|
Definition at line 165 of file filewrite.h. |
|
|
Definition at line 163 of file filewrite.h. |
|
|
Definition at line 160 of file filewrite.h. |
|
|
Definition at line 162 of file filewrite.h. |
|
|
Definition at line 161 of file filewrite.h. |
|
|
Definition at line 158 of file filewrite.h. |