00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024 #include "jdkmidi/world.h"
00025 #include "jdkmidi/filewritemultitrack.h"
00026
00027 namespace jdkmidi
00028 {
00029
00030
00031 MIDIFileWriteMultiTrack::MIDIFileWriteMultiTrack(
00032 const MIDIMultiTrack *mlt_,
00033 MIDIFileWriteStream *strm_
00034 )
00035 :
00036 multitrack( mlt_ ),
00037 writer( strm_ )
00038 {
00039 }
00040
00041 MIDIFileWriteMultiTrack::~MIDIFileWriteMultiTrack()
00042 {
00043 }
00044
00045 bool MIDIFileWriteMultiTrack::Write( int num_tracks, int division )
00046 {
00047 bool f=true;
00048 if( !PreWrite() )
00049 {
00050 return false;
00051 }
00052
00053
00054
00055 writer.WriteFileHeader( (num_tracks>0), num_tracks, division );
00056
00057
00058
00059 for( int i=0; i<num_tracks; ++i )
00060 {
00061 if( writer.ErrorOccurred() )
00062 {
00063 f=false;
00064 break;
00065 }
00066
00067 const MIDITrack *t = multitrack->GetTrack(i);
00068
00069 MIDIClockTime last_event_time=0;
00070
00071 writer.WriteTrackHeader(0);
00072
00073 if( t )
00074 {
00075 for( int event_num=0; event_num<t->GetNumEvents(); ++event_num )
00076 {
00077 const MIDITimedBigMessage *ev = t->GetEventAddress( event_num );
00078 if( ev && !ev->IsNoOp() )
00079 {
00080 last_event_time = ev->GetTime();
00081
00082 if( !ev->IsDataEnd() )
00083 {
00084 writer.WriteEvent( *ev );
00085
00086 if( writer.ErrorOccurred() )
00087 {
00088 f=false;
00089 break;
00090 }
00091 }
00092 }
00093 }
00094 }
00095 writer.WriteEndOfTrack(0);
00096 writer.RewriteTrackLength();
00097 }
00098
00099 if( !PostWrite() )
00100 {
00101 return false;
00102 }
00103
00104 return f;
00105 }
00106
00107
00108 bool MIDIFileWriteMultiTrack::PreWrite()
00109 {
00110 return true;
00111 }
00112
00113 bool MIDIFileWriteMultiTrack::PostWrite()
00114 {
00115 return true;
00116 }
00117
00118
00119
00120 }