#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. |